如何使用正确的变量值在Delphi中调用dll C函数?

如何使用正确的变量值在Delphi中调用dll C函数?,c,delphi,dll,C,Delphi,Dll,我已将以下内容从“RFIDAPI.dll”C函数转换为Delphi: bool SAAT_YTagSelect( void *pHandle, unsigned char nOpEnable, unsigned char nMatchType, unsigned char *MatchData, unsigned

我已将以下内容从“RFIDAPI.dll”C函数转换为Delphi:

bool SAAT_YTagSelect( void *pHandle, 
                      unsigned char nOpEnable, 
                      unsigned char nMatchType, 
                      unsigned char *MatchData, 
                      unsigned char nLenth )

函数SAAT_YTagSelect(幻影:指针;
不允许,
nMatchType,
匹配数据,
nLenth:泛六边形):布尔型;stdcall;
我试图调用该函数,但遇到访问冲突。显然,我没有为nOpEnable 1Byte变量指定正确的值

可变NOP启用蜂鸣器或LED启用(1字节):


无符号字符
参数是1字节整数类型,而不是字符串。。。因此它们对应于Delphi的
字节
,而不是
PAnsiChar
。每个蜂鸣器/LED的数字是要在该字节中设置的位位置,而不是字符串中的字符位置。因此,原型应该是:

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;

此外,您还没有指出任何问题,这可能取决于它的用途。
无符号字符
参数是1字节整数类型,而不是字符串。。。因此它们对应于Delphi的
字节
,而不是
PAnsiChar
。每个蜂鸣器/LED的数字是要在该字节中设置的位位置,而不是字符串中的字符位置。因此,原型应该是:

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;

此外,您还没有指出任何问题,这可能取决于它的用途。
无符号字符
参数是1字节整数类型,而不是字符串。。。因此它们对应于Delphi的
字节
,而不是
PAnsiChar
。每个蜂鸣器/LED的数字是要在该字节中设置的位位置,而不是字符串中的字符位置。因此,原型应该是:

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;

此外,您还没有指出任何问题,这可能取决于它的用途。
无符号字符
参数是1字节整数类型,而不是字符串。。。因此它们对应于Delphi的
字节
,而不是
PAnsiChar
。每个蜂鸣器/LED的数字是要在该字节中设置的位位置,而不是字符串中的字符位置。因此,原型应该是:

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;

此外,您还没有指出任何问题,这可能是一个问题,取决于它的用途。

函数签名的正确翻译是:

function SAAT_YTagSelect(pHandle: Pointer; nOpEnable, nMatchType: Byte; MatchData: PByte; nLenth: Byte): Boolean; stdcall;
用法如下所示:

var
  hp: Pointer;
  b: Byte;
  Data: PAnsiChar;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data := '84500080';
   if SAAT_YTagSelect(hp, b, 1, PByte(data), 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
var
  hp: Pointer;
  b: Byte;
  Data: array[0..7] of Byte;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data[0] := 8;
   data[1] := 4;
   data[2] := 5;
   data[3] := 0;
   data[4] := 0;
   data[5] := 0;
   data[6] := 8;
   data[7] := 0;
   if SAAT_YTagSelect(hp, b, $01, @data[0], 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
我找不到有关
SAAT_YTagSelect()
函数的任何文档,因此很难确切地知道
MatchData
参数需要什么。考虑到您有使用字符串作为数值参数的习惯,它甚至可能更像这样:

var
  hp: Pointer;
  b: Byte;
  Data: PAnsiChar;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data := '84500080';
   if SAAT_YTagSelect(hp, b, 1, PByte(data), 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
var
  hp: Pointer;
  b: Byte;
  Data: array[0..7] of Byte;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data[0] := 8;
   data[1] := 4;
   data[2] := 5;
   data[3] := 0;
   data[4] := 0;
   data[5] := 0;
   data[6] := 8;
   data[7] := 0;
   if SAAT_YTagSelect(hp, b, $01, @data[0], 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;

函数签名的正确翻译为:

function SAAT_YTagSelect(pHandle: Pointer; nOpEnable, nMatchType: Byte; MatchData: PByte; nLenth: Byte): Boolean; stdcall;
用法如下所示:

var
  hp: Pointer;
  b: Byte;
  Data: PAnsiChar;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data := '84500080';
   if SAAT_YTagSelect(hp, b, 1, PByte(data), 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
var
  hp: Pointer;
  b: Byte;
  Data: array[0..7] of Byte;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data[0] := 8;
   data[1] := 4;
   data[2] := 5;
   data[3] := 0;
   data[4] := 0;
   data[5] := 0;
   data[6] := 8;
   data[7] := 0;
   if SAAT_YTagSelect(hp, b, $01, @data[0], 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
我找不到有关
SAAT_YTagSelect()
函数的任何文档,因此很难确切地知道
MatchData
参数需要什么。考虑到您有使用字符串作为数值参数的习惯,它甚至可能更像这样:

var
  hp: Pointer;
  b: Byte;
  Data: PAnsiChar;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data := '84500080';
   if SAAT_YTagSelect(hp, b, 1, PByte(data), 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
var
  hp: Pointer;
  b: Byte;
  Data: array[0..7] of Byte;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data[0] := 8;
   data[1] := 4;
   data[2] := 5;
   data[3] := 0;
   data[4] := 0;
   data[5] := 0;
   data[6] := 8;
   data[7] := 0;
   if SAAT_YTagSelect(hp, b, $01, @data[0], 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;

函数签名的正确翻译为:

function SAAT_YTagSelect(pHandle: Pointer; nOpEnable, nMatchType: Byte; MatchData: PByte; nLenth: Byte): Boolean; stdcall;
用法如下所示:

var
  hp: Pointer;
  b: Byte;
  Data: PAnsiChar;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data := '84500080';
   if SAAT_YTagSelect(hp, b, 1, PByte(data), 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
var
  hp: Pointer;
  b: Byte;
  Data: array[0..7] of Byte;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data[0] := 8;
   data[1] := 4;
   data[2] := 5;
   data[3] := 0;
   data[4] := 0;
   data[5] := 0;
   data[6] := 8;
   data[7] := 0;
   if SAAT_YTagSelect(hp, b, $01, @data[0], 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
我找不到有关
SAAT_YTagSelect()
函数的任何文档,因此很难确切地知道
MatchData
参数需要什么。考虑到您有使用字符串作为数值参数的习惯,它甚至可能更像这样:

var
  hp: Pointer;
  b: Byte;
  Data: PAnsiChar;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data := '84500080';
   if SAAT_YTagSelect(hp, b, 1, PByte(data), 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
var
  hp: Pointer;
  b: Byte;
  Data: array[0..7] of Byte;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data[0] := 8;
   data[1] := 4;
   data[2] := 5;
   data[3] := 0;
   data[4] := 0;
   data[5] := 0;
   data[6] := 8;
   data[7] := 0;
   if SAAT_YTagSelect(hp, b, $01, @data[0], 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;

函数签名的正确翻译为:

function SAAT_YTagSelect(pHandle: Pointer; nOpEnable, nMatchType: Byte; MatchData: PByte; nLenth: Byte): Boolean; stdcall;
用法如下所示:

var
  hp: Pointer;
  b: Byte;
  Data: PAnsiChar;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data := '84500080';
   if SAAT_YTagSelect(hp, b, 1, PByte(data), 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
var
  hp: Pointer;
  b: Byte;
  Data: array[0..7] of Byte;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data[0] := 8;
   data[1] := 4;
   data[2] := 5;
   data[3] := 0;
   data[4] := 0;
   data[5] := 0;
   data[6] := 8;
   data[7] := 0;
   if SAAT_YTagSelect(hp, b, $01, @data[0], 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
我找不到有关
SAAT_YTagSelect()
函数的任何文档,因此很难确切地知道
MatchData
参数需要什么。考虑到您有使用字符串作为数值参数的习惯,它甚至可能更像这样:

var
  hp: Pointer;
  b: Byte;
  Data: PAnsiChar;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data := '84500080';
   if SAAT_YTagSelect(hp, b, 1, PByte(data), 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;
var
  hp: Pointer;
  b: Byte;
  Data: array[0..7] of Byte;
begin
   SAAT_TCPInit(hp, '192.168.0.238', 7086);
   SAAT_Open(hp);
   ...
   b := 1 or 2;
   data[0] := 8;
   data[1] := 4;
   data[2] := 5;
   data[3] := 0;
   data[4] := 0;
   data[5] := 0;
   data[6] := 8;
   data[7] := 0;
   if SAAT_YTagSelect(hp, b, $01, @data[0], 8) then
     StatusBar1.Panels[1].Text := 'Tag Selected';
   ...
   SAAT_Close(hp);
end;

我相信你是在要求c函数:bool SAAT_YTagSelect(void*pHandle,unsignedchar nOpEnable,unsigned char nMatchType,unsigned char*MatchData,unsigned char nLenth)你读过了吗:FWIW,
char*
是指向c中8位字符的指针,因此可以翻译成
PAnsiChar
。该名称中的
P
代表指针。所以你通常会把
char
翻译成
AnsiChar
,而不是
PAnsiChar
(很大的区别!)。但是,字符也可以按一个字节来表示,在C语言中,尤其是当它用作
无符号字符时。因此,
无符号字符
的正确翻译在大多数情况下是,
字节
。您应该真正阅读David提到的文章。我慢慢地开始明白大卫关于你不想学习的观点。在过去,他们常常称这样的人为a。我确实读过这篇文章,是的,我正在努力学习,尽管伊芙不是c#开发者。现在,我只想学习基础知识。我相信你要求的是c函数:bool SAAT_YTagSelect(void*pHandle,unsignedchar nOpEnable,unsigned char nMatchType,unsigned char*MatchData,unsigned char nLenth)你读过了吗:FWIW,
char*
是指向c中8位字符的指针,因此,它可以翻译为
PAnsiChar
。该名称中的
P
代表指针。所以你通常会把
char
翻译成
AnsiChar
,而不是
PAnsiChar
(很大的区别!)。但是,字符也可以按一个字节来表示,在C语言中,尤其是当它用作
无符号字符时。因此,
无符号字符
的正确翻译在大多数情况下是,
字节
。您应该真正阅读David提到的文章。我慢慢地开始发疯了