Но на первом же вызове функция из DLL сообщает об ошибочном результате.
Пример который пытался «упростить» в Lazarus работает.
Что и где пропущено при переносе?
Собственно программа с ошибкой:
- Код: Выделить всё
Uses Windows;
Const
TWLG_USERLOCALE = -1; TWRC_SUCCESS = 0;
DG_CONTROL = $0001; DAT_IDENTITY = $0003; MSG_GETFIRST = $0004;
Type
TW_UINT16 = word; TW_UINT32 = cardinal;
TW_STR32 = array[0..33] of AnsiChar;
TW_MEMREF = pointer;
TW_VERSION = packed record
MajorNum: TW_UINT16;
MinorNum: TW_UINT16;
Language: TW_UINT16;
Country: TW_UINT16;
Info: TW_STR32;
end;
pTW_IDENTITY = ^TW_IDENTITY;
TW_IDENTITY = packed record
Id: TW_UINT32;
Version: TW_VERSION;
ProtocolMajor: TW_UINT16;
ProtocolMinor: TW_UINT16;
SupportedGroups: TW_UINT32;
Manufacturer: TW_STR32;
ProductFamily: TW_STR32;
ProductName: TW_STR32;
end;
DSMENTRYPROC = function(pOrigin: pTW_IDENTITY; pDest: pTW_IDENTITY;
DG: TW_UINT32; DAT: TW_UINT16; MSG: TW_UINT16;
pData: TW_MEMREF): TW_UINT16; stdcall;
TDSMEntryProc = DSMENTRYPROC;
Var
fHandle : tHandle;
TWAINProc : tDSMEntryProc;
AppInfo : tw_IDENTITY;
NewSource: tw_IDENTITY;
CallRes: tw_UINT16;
Begin
WriteLn('+++');
fHandle:=LoadLibrary('C:\Windows\TWAIN_32.DLL');
if fHandle = INVALID_HANDLE_VALUE then begin
WriteLn('TWAIN_32.DLL не загружена');
Halt;
end
else WriteLn('Адрес TWAIN_32.DLL = ', longint(fHandle));
TWAINProc:=tDSMEntryProc(GetProcAddress(fHandle, 'DSM_Entry'));
WriteLn('Адрес DSM_Entry = ', longint(TWAINProc));
with AppInfo do begin
Id:=0;
with Version do begin
MajorNum:=1;
MinorNum:=0;
Language:=TWLG_UserLocale;
Country:=1;
Info:='Application name';
end;
ProtocolMajor:=1;
ProtocolMinor:=9;
SupportedGroups:=3;
Manufacturer:='';
ProductFamily:='';
ProductName:='';
end;
NewSource:=AppInfo;
CallRes:=TWAINProc(@AppInfo, nil, DG_CONTROL, DAT_IDENTITY, MSG_GETFIRST, @NewSource);
WriteLn('CallRes = TWRC_Success? - ', CallRes = TWRC_Success);
End.
Библиотека (delphitwain-kluug-1-5--2014-06-25.zip), которая упрощалась, во вложении.
Из неё удалены все файлы не касающиеся нужного мне кода: информация о лицензии, версия, справка и т.д., так как размер оригинального файла превышал ограничения на размер вложения.