使用已编译的Delphi dll,声明的函数之一是
MYDLL.DLL
type
TInfo = array [0..255] of byte;
type
public
function GetInfo(Memadr, Infolen: Integer): TInfo;
在C#中使用它的DLLImport格式是什么?
答案 0 :(得分:4)
我会这样做:
<强>的Delphi 强>
type
TInfo = array [0..255] of byte;
procedure GetInfo(Memadr, Infolen: Integer; var Result: TInfo); stdcall;
<强> C#强>
[DllImport(@"testlib.dll")]
static extern void GetInfo(int Memadr, int Infolen, byte[] result);
static void Main(string[] args)
{
byte[] result = new byte[256];
GetInfo(0, result.Length, result);
foreach (byte b in result)
Console.WriteLine(b);
}
您需要使调用约定匹配。我已经去了stdcall
这是P / invoke的默认值(这就是为什么它没有在P / invoke签名中指定)。
我会避免将数组作为函数返回值返回。以这种方式将其作为参数进行编组会更容易。
事实上,一般来说,如果你想摆脱固定大小的缓冲区,你可以这样做:
<强>的Delphi 强>
procedure GetInfo(Memadr, Infolen: Integer; Buffer: PByte); stdcall;
然后,要填写缓冲区,您需要使用一些指针算法或等效的东西。
答案 1 :(得分:0)
需要更正原始帖子中的错误
type
TInfo = array [0..255] of byte;
implementation
function GetInfo(Memadr, Infolen: Integer): TInfo;
procedure TForm1.Button5Click(Sender: TObject);
var Data: TInfo;
i: integer;
s: string;
begin
for i:=0 to 255 do Data[i]:=0;
Data:=GetInfo($04,12);
if (Data[1]=0) then
begin StatusBar1.SimpleText:='No Data'; exit; end;
s:='';
for i:=1 to 8 do
s:=s+Chr(Data[i+1]);
Edit3.Text:=s;
end;