Подключение dll на С++ к Lazarus

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Подключение dll на С++ к Lazarus

Сообщение DmitriyX » 17.11.2017 12:59:53

Здравствуйте
Есть прибор TESTER ARINC http://www.elcus.ru/pribors.php?ID=test-arinc
для управления им через COM порт есть ПО, библиотека TesterArinc_DLL_W2K.dll для XP
Библиотек написана на с++ исходников нету
Пытаюсь подключить функцию:
Описание:
void version_TesterArinc_DLL (char *lpcod )-Функция возвращает номер версии библиотеки.
Параметры:
lpcod - указатель на массив char[4], в который возвращается версия библиотеки

В файле TesterArinc_DLL_W2K.h функция прописана как:
Код: Выделить всё
TestDLL void __stdcall version_TesterArinc_DLL(char * );


Приведен Пример вызова на С++ :
Код: Выделить всё
//2/29/Чтение версии библиотеки
   char ver[4];
   version_TesterArinc_DLL(ver );
   MessageBox   (NULL,ver,"DLL version",MB_OK);


Делаю в Lazarus:
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
    { TForm1 }
    TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
    private
    public
    end;

var
    Form1: TForm1;
implementation
{$R *.lfm}

procedure version_TesterArinc_DLL(var s:PChar);stdcall; external 'TesterArinc_DLL_W2K.dll';

{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var k:PChar;
begin
    version_TesterArinc_DLL(k);
end;                                   


При запуске появляется сообщение: "Точка входа в процедуру version_TesterArinc_DLL в библиотеке не найдена
В чём может быть проблема?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
DmitriyX
незнакомец
 
Сообщения: 7
Зарегистрирован: 10.02.2017 14:02:42

Re: Подключение dll на С++ к Lazarus

Сообщение Vadim » 17.11.2017 14:06:32

После названия DLL не пробовали name дополнительно указывать?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Подключение dll на С++ к Lazarus

Сообщение bormant » 17.11.2017 14:26:04

Следующей проблемой будет var s: PChar вместо s: PChar, в прототипе же char*, а не char**.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Подключение dll на С++ к Lazarus

Сообщение DmitriyX » 19.11.2017 13:40:30

Сделал так:
Код: Выделить всё
procedure version_TesterArinc_DLL(vv:PChar);stdcall; //stdcall;
external 'TesterArinc_DLL_W2K.dll' index 29 ;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var kk:PChar;
  d:string;
begin
  d:='0';
  kk:=@d;
  version_TesterArinc_DLL(kk);
  memo1.lines.add(strpas(kk));
  kk:=nil;
end;                                     


Почему- то работает странно: если сделать быструю компиляцию, и запустить, то все нормально
1.JPG

если повторно запусть, либо повторно сделать быструю компиляцию, то в мемо успевает вывести результат, сразу вы
летает сообщение об ошибке
Снимок.JPG


Использовал name вместо index также все происходит, имя брал с помощью Dependency Walker
У вас нет необходимых прав для просмотра вложений в этом сообщении.
DmitriyX
незнакомец
 
Сообщения: 7
Зарегистрирован: 10.02.2017 14:02:42

Re: Подключение dll на С++ к Lazarus

Сообщение serbod » 19.11.2017 14:58:12

Ты передаешь в функцию адрес паскалевской string, который нифига не сишный char *
Надо так:
version_TesterArinc_DLL(PChar(d));


И еще, по описанию функция возвращает null-terminated string, а в какую память оно ее запишет? Ты ей один байт выделил. А в сишном примере было 4 байта. Делай тогда:
d := '0000';
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Подключение dll на С++ к Lazarus

Сообщение DmitriyX » 19.11.2017 19:03:24

Нашел в чем ошибка. добавил new() все заработало
procedure TForm1.Button1Click(Sender: TObject);
var kk:pchar;
begin
new(kk);
version_TesterArinc_DLL(kk);
memo1.lines.add(strpas(kk));
end;
DmitriyX
незнакомец
 
Сообщения: 7
Зарегистрирован: 10.02.2017 14:02:42

Re: Подключение dll на С++ к Lazarus

Сообщение SSerge » 20.11.2017 04:54:28

DmitriyX писал(а):Нашел в чем ошибка. добавил new() все заработало


ага, прям нашел. :D
Ошибка-то как была, так и осталась, причем принципиальная: выделено 1 байт, в этот один байт пересылается четыре. А то что работает - так это временно.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Подключение dll на С++ к Lazarus

Сообщение DmitriyX » 20.11.2017 12:48:52

Все работает, вылетов нет
DmitriyX
незнакомец
 
Сообщения: 7
Зарегистрирован: 10.02.2017 14:02:42

Re: Подключение dll на С++ к Lazarus

Сообщение serbod » 20.11.2017 13:50:00

DmitriyX писал(а):Все работает, вылетов нет

Тебе просто повезло, что менеджер памяти выделяет не по одному байту, а по 4 как минимум. Но это решение в принципе неправильное, тем более, что возврата памяти обратно я не вижу, будет утечка.

Либо выделяй 4 байта через GetMem(kk, 4) и затем FreeMem(kk), либо через SetLength(string, 4), а память сама вернется.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 27

Рейтинг@Mail.ru