如何在 Delphi 中訪問 C DLL 的函式
#define CCONV _stdcall
typedef struct{
unsigned long BaudRate;
unsigned char PortNumber;
.....
}SSP_COMMAND;
NOMANGLE int CCONV OpenSSPComPort (SSP_COMMAND * cmd);
在檔案中: OpenSSPComPort
引數: 指向SSP_COMMAND 結構的指標
回傳: WORD 0 表示失敗,1 表示成功
我懷疑我對這個Pointer錯了。
在德爾福我正在嘗試這個:
type
SSP_COMMAND=class
BaudRate:integer;
PortNumber:integer;
end;
type
TOpenSSPComPort = function (sspc:SSP_COMMAND):Integer;stdcall;
var nv11 : THandle;
OpenSSPComPort:TOpenSSPComPort;
procedure TForm1.FormCreate(Sender: TObject);
begin
if nv11 = 0 then
begin
nv11 := LoadLibrary(pchar('ITLSSPProc.dll'));
@OpenSSPComPort:=GetProcAddress(nv11, 'OpenSSPComPort');
ss_cmd := SSP_COMMAND.create;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ss_cmd.BaudRate := 9600;
ss_cmd.PortNumber :=8;
If OpenSSPComPort(ss_cmd)=0 Then
Memo1.lines.add('Error OpenSSPComPort')
else
Memo1.lines.add('OpenSSPComPort - OK');
end;
所以結果是:COM0 - 無法打開此埠,但我發送了8 這意味著 SSP_COMMAND 發送不正確
uj5u.com熱心網友回復:
根據您提供的鏈接中的 C 定義,您需要更改以下內容:
type
SSP_FULL_KEY = packed record
FixedKey : UINT64;
EncryptKey : UINT64;
end;
type
SSP_COMMAND=packed record
key : SSP_FULL_KEY;
BaudRate:integer;
PortNumber:integer;
SSPAddress : byte;
RetryLevel : byte;
EncryptionStatus : byte;
CommandDataLength : byte;
CommandData : Array[0..254] of byte;
ResponseStatus : byte;
ResponseDataLength : byte;
ResponseData : Array[0..254] of byte;
end;
PSSP_COMMAND = ^SSP_COMMAND;
type
TOpenSSPComPort = function (sspc:PSSP_COMMAND):Integer;stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
ss_cmd : SSP_COMMAND;
begin
FillChar(ss_cmd, sizeof(ss_cmd), 0);
ss_cmd.BaudRate := 9600;
ss_cmd.PortNumber :=8;
If OpenSSPComPort(@ss_cmd)=0 Then
Memo1.lines.add('Error OpenSSPComPort')
else
Memo1.lines.add('OpenSSPComPort - OK');
end;
uj5u.com熱心網友回復:
這個特殊的庫像這樣作業(可能對某人有用)我不知道為什么這適用于 Windows XP 并且適用于 Windows 10 64bit 但不適用于另一臺具有財政設備和 Windows 10 64bit 的計算機
type
SSP_COMMAND = class
BaudRate:integer;
PortNumber:byte;
//... have more properties
end;
PSSP_COMMAND=^SSP_COMMAND;
TOpenSSPComPort= function (sspc:PSSP_COMMAND):Integer;stdcall;
var
Form1: TForm1;
nv11 : THandle;
OpenSSPComPort:TOpenSSPComPort;
ss_cmd:PSSP_COMMAND;
procedure TForm1.FormCreate(Sender: TObject)
begin
nv11 := LoadLibrary(pchar('ITLSSPProc.dll'));
@OpenSSPComPort:=GetProcAddress(nv11, 'OpenSSPComPort');
// only here, when creating form or class
New(ss_cmd);
ss_cmd^ := SSP_COMMAND.create;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ss_cmd.BaudRate := 9600;
ss_cmd.PortNumber :=3;
if OpenSSPComPort(ss_cmd)=0 Then
Memo1.lines.add('Error OpenSSPComPort');
else
Memo1.lines.add('OpenSSPComPort - OK');
end;
如果我將 SSP_COMMAND = class更改 為 SSP_COMMAND = record 它不起作用
指向 SSP_COMMAND 結構的指標失效,函式根本不起作用
我試試
type
SSP_COMMAND = record
...
procedure TForm1.FormCreate(Sender: TObject)
begin
New(ss_cmd); // only here
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ss_cmd^.BaudRate := 9600;
ss_cmd^.PortNumber :=3;
if OpenSSPComPort(ss_cmd)=0 Then
Memo1.lines.add('Error OpenSSPComPort');
else
Memo1.lines.add('OpenSSPComPort - OK');
end;
它不是那樣作業的
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503902.html
