Два дня изысканий не привели к успеху, решил обратится к специалистам.
Вот пример кода работающий в Windows, но упорно не желающий работать в Linux.
- Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, dynlibs;
const
{$IFDEF MSWINDOWS}
NameLib = 'FTD2XX.DLL';
{$ENDIF}
{$IFDEF UNIX}
NameLib = '/usr/local/lib/libftd2xx.so';
{$ENDIF}
type
TFT_ListDevices = function(pvArg1:Pointer; pvArg2:Pointer; dwFlags:Dword): integer; stdcall;
TFT_Open = function(Index:Integer; ftHandle:Pointer): integer; stdcall;
TFT_Close = function(ftHandle:Dword): integer; stdcall;
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
fFtHandle: UInt32;
fLibHandle: THandle;
FT_ListDevices: TFT_ListDevices;
FT_Open: TFT_Open;
FT_Close: TFT_Close;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
NumDevs: UInt16;
begin
fLibHandle := LoadLibrary(NameLib);
if fLibHandle <> 0 then
begin
FT_ListDevices := TFT_ListDevices(GetProcAddress(fLibHandle, 'FT_ListDevices'));
if @FT_ListDevices <> nil then
begin
FT_Open := TFT_Open(GetProcAddress(fLibHandle, 'FT_Open'));
FT_Close := TFT_Close(GetProcAddress(fLibHandle, 'FT_Close'));
end;
end;
if FT_ListDevices(@NumDevs, nil, $80000000) = 0 then // Запрос числа FTDI-устройств, подключенных к ПК.
begin // Результат запроса в NumDevs.
if NumDevs > 0 then
begin
FT_Open(0, @fFtHandle);
FT_Close(fFtHandle);
end;
FreeLibrary(fLibHandle);
end;
Caption := 'Кол-во: ' + IntToStr(NumDevs); // В Linux NumDevs = 0 ???
end;
end.
В Linux NumDevs = 0. А кроме этого после завершения FormCreate: "Процесс вызвал исключение ...."
К сожалению в Linux я пока ржавый чайник.
Библиотека тут: /usr/local/lib/libftd2xx.so
Буду благодарен если поделитесь опытом.