|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Импорт функции из DLL (предположительно, написана на С)
Уже не первый день пытаюсь воспользоваться хоть одной функцией из SDK ZKTeco, но пока безуспешно. Раньше с таким не сталкивался, поиски на просторах интернета дали слабые результаты (перешел на динамическую загрузку - программа уже начала запускаться!)
Пытаюсь хотя бы подключиться или просто получить указатель на функцию - не выходит. Так выглядит описание функции в мануале: Connect_Net [Definition] VARIANT_BOOL Connect_Net( [in] BSTR IPAdd, [in] long Portl) [Usage] Connect to the device via the IP address and set up a network connection with the device. [Parameter] IPAdd: IP address of the device Port: Port number used for connecting to the device. The default value is 4370. [Return Value] Return True if it is successful, or return False. [Related Function] Disconnect, Connect_Com, Connect_USB Код небольшой программы следующий Код:
unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ActiveX; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var W1:AnsiString; B1:TBSTR; L1:Longint; dHandle:THandle; Connect_Net: function (IPAdd:String; Port:Longint): boolean; cdecl; // stdcall не помогал begin @Connect_Net:=nil; dHandle:=LoadLibrary('zkemkeeper.dll'); if dHandle<>0 then begin ShowMessage('DLL Load'); @Connect_Net:=GetProcAddress(dHandle, 'Connect_Net'); if @Connect_Net<>nil then begin W1:='192.168.1.201'; B1:=Pointer(W1); L1:=4370; if Connect_Net(B1,L1) then ShowMessage('Connect!'); end else begin ShowMessage('Import function Fail!'); Exit; end; FreeLibrary(dHandle); end else ShowMessage('Load DLL Fail!'); end; end. Помогите, пожалуйста, хотя бы начать. Файлы с SDK и демо-программами+исходники приложить не получилось, поэтому вставлю ссылки Communication Protocol SDK(32Bit Ver6.2.4.1) Communication Protocol SDK(64Bit Ver6.2.4.1) |
#2
|
|||
|
|||
Ну,
1. Тебе точно нужна 32-битная (которая x86). x64 ты в 32 битный процесс без танцев с бубнами не загрузишь. А Delphi 7 генерит именно 32 битный код. 2. Надо смотреть, что за тип VARIANT_BOOL. Походу, это ShortInt. 3. BSTR - это будет WideString 4. Integer и так по дефолту LongInt 5. cdecl - правильно, если это нативная С функция (т.е. в исходниках НЕ PASCAL) Код:
type VARBOOL = ShortInt; const VARBOOL_TRUE : VARBOOL = -1; VARBOOL_FALSE : VARBOOL = 0; function Net_Connect(IPAdd: WideString; Port: Integer) : VARBOOL; cdecl; external 'zkemkeeper.dll'; Ну и обращение будет такое примерно: Код:
if Net_Connect(WideString('127.0.0.1'),8080) = VARBOOL_TRUE Then ShowMessage('Connected') Else ShowMessage('Error'); Последний раз редактировалось lmikle, 13.09.2017 в 01:51. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
DIEsel (13.09.2017)
|
#3
|
|||
|
|||
как ни пытался встроить вашу конструкцию, делфи все время ругается на синтаксис, а в силу неопытности не могу понять, что ему не нравится, и где тогда это все должно быть. Попробовал сделать так - не помогло:
Connect_Net: function (IPAdd:WideString; Port:Integer): ShortInt; cdecl; Меня еще сильно напрягает, что даже процедура без параметров не поддается! [Definition] Disconnect(void) [Usage] Disconnect from the device and release related resources. [Parameter] None [Return Value] None Код:
procedure TForm1.Button1Click(Sender: TObject); var W1:WideString; B1:TBSTR; L1:Longint; dHandle:THandle; Disconnect: procedure (); stdcall; //cdecl тоже не помог begin @Disconnect:=nil; dHandle:=LoadLibrary('zkemkeeper.dll'); if dHandle<>0 then begin ShowMessage('DLL Load'); @Disconnect:=GetProcAddress(dHandle, 'Disconnect'); if @Disconnect<>nil then ShowMessage('Happy'); FreeLibrary(dHandle); end else ShowMessage('Load DLL Fail!'); end; То есть даже указатель на процедуру не получается. |
#4
|
|||
|
|||
Во первых, это AxtiveX сервер, никаких Net_Connect эта библиотека не экспортирует.
1)Сначала нужно её зарегистрировать. >regsvr32 zkemkeeper.dll 2)Затем из Дельфи Меню->Component->Import ActiveX Control...Выбрать ZKEMKeper и нажать Install. 3)Если всё правильно, то на палитре компонент на вкладке ActiveX появится компонент TCZKEM Кидаешь его на форму ... |
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
DIEsel (13.09.2017)
|
#5
|
|||
|
|||
Спасибо большое! Буду благодарен, если расскажите, как вы вообще определили, что это такое?
Вечером попробую функции |
#6
|
|||
|
|||
BSTR - первый признак, что это ActiveX
Затем смотрим, что экспортирует библиотека. |
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
DIEsel (13.09.2017)
|