我已将以下内容从“RFIDAPI.dll”C 函数转换为 Delphi:
bool SAAT_YTagSelect( void *pHandle,
unsigned char nOpEnable,
unsigned char nMatchType,
unsigned char *MatchData,
unsigned char nLenth )
到
function SAAT_YTagSelect( pHandle: Pointer;
nOpEnable,
nMatchType,
MatchData,
nLenth: PAnsichar): Boolean; stdcall;
我正在尝试调用该函数,但遇到了访问冲突。显然我没有为 nOpEnable 1Byte 变量分配正确的值。
变量 nOpEnable 蜂鸣器或 LED 使能(1byte):
1: enable 0: disable 7 6 5 4 3 led buzzer N/A N/A N/A N/A N/A 1 1
procedure TForm5.Button4Click(Sender: TObject);
var
hp: Pointer;
b: array[0..7] of AnsiChar;
begin
b[0] := '1';
b[1] := '1';
b[2] := '0';
b[3] := '0';
b[4] := '0';
b[5] := '0';
b[6] := '0';
b[7] := '0';
if SAAT_YTagSelect(hp, b, '0x01', '84500080', '8') then
StatusBar1.Panels[1].Text := 'Tag Selected';
end;
最佳答案
unsigned char
参数是1字节整型,不是字符串...所以对应Delphi的Byte
而不是PAnsiChar
。每个蜂鸣器/LED 的数字是要在该字节中设置的位位置,而不是字符串中的字符位置。所以,原型(prototype)大概应该是:
function SAAT_YTagSelect(pHandle: Pointer; nOpEnable, nMatchType: Byte; MatchData: PByte; nLenth: Byte): Boolean; stdcall;
调用应该是这样的:
procedure TForm5.Button4Click(Sender: TObject);
var
hp: Pointer;
b: Byte;
data: PAnsiChar;
begin
// set hp appropriately first
b := 1 or 2; // Bitwise OR the values of each set bit
data := '84500080';
if SAAT_YTagSelect(hp, b, 1, PByte(data), 8) then
StatusBar1.Panels[1].Text := 'Tag Selected';
end;
此外,您还没有将 hp
指向任何东西,这可能是一个问题,具体取决于它的用途。
关于c - 如何使用正确的变量值在 Delphi 中调用 dll C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26835386/