Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.09.2017, 19:25
DIEsel DIEsel вне форума
Прохожий
 
Регистрация: 09.09.2016
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Импорт функции из 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.
Вообще есть два архива с документацией и демо-программами с исходниками на C# (откуда я сделал вывод, что zkemkeeper - нужная библиотека): х86 и х64, на моем ноуте система х64 и Delphi 7, и нормально устанавливаются библиотеки х64, но с ними даже библиотека в программе не загружается, х86 ставиться не желают, но программа с библиотекой хоть как-то дружит.
Помогите, пожалуйста, хотя бы начать.
Файлы с SDK и демо-программами+исходники приложить не получилось, поэтому вставлю ссылки
Communication Protocol SDK(32Bit Ver6.2.4.1)
Communication Protocol SDK(64Bit Ver6.2.4.1)
Ответить с цитированием
  #2  
Старый 13.09.2017, 01:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну,
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  
Старый 13.09.2017, 08:03
DIEsel DIEsel вне форума
Прохожий
 
Регистрация: 09.09.2016
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

как ни пытался встроить вашу конструкцию, делфи все время ругается на синтаксис, а в силу неопытности не могу понять, что ему не нравится, и где тогда это все должно быть. Попробовал сделать так - не помогло:
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  
Старый 13.09.2017, 10:35
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Во первых, это AxtiveX сервер, никаких Net_Connect эта библиотека не экспортирует.
1)Сначала нужно её зарегистрировать.
>regsvr32 zkemkeeper.dll
2)Затем из Дельфи Меню->Component->Import ActiveX Control...Выбрать ZKEMKeper и нажать Install.
3)Если всё правильно, то на палитре компонент на вкладке ActiveX появится компонент TCZKEM
Кидаешь его на форму ...
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
DIEsel (13.09.2017)
  #5  
Старый 13.09.2017, 11:52
DIEsel DIEsel вне форума
Прохожий
 
Регистрация: 09.09.2016
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо большое! Буду благодарен, если расскажите, как вы вообще определили, что это такое?
Вечером попробую функции
Ответить с цитированием
  #6  
Старый 13.09.2017, 12:46
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

BSTR - первый признак, что это ActiveX
Затем смотрим, что экспортирует библиотека.
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
DIEsel (13.09.2017)
  #7  
Старый 13.09.2017, 21:10
DIEsel DIEsel вне форума
Прохожий
 
Регистрация: 09.09.2016
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Попробовал сделать так, как вы и говорили, и все заработало! Спасибо Вам большое!
А как, кстати, можно посмотреть это (экспорт)?
Ответить с цитированием
  #8  
Старый 14.09.2017, 10:35
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Там же, на диалоге выбора ActiveX компонент, рядом с кнопкой Install находится кнопка Create unit.
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
DIEsel (19.09.2017)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter