开发者

Delphi dll function to C#

开发者 https://www.devze.com 2023-03-20 11:45 出处:网络
With a compiled Delphi dll, one of the functions declared is Mydll.dll type TInfo = array [0..255] of byte;

With a compiled Delphi dll, one of the functions declared is

Mydll.dll

type
 TInfo = array [0..255] of byte;

type
 public
   function GetInfo(Me开发者_如何学Gomadr, Infolen: Integer): TInfo;

what is the DLLImport format to use this in C#?


I'd do it like this:

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);
}

You need to get the calling conventions to match. I've gone for stdcall which is the default for P/invoke (that's why it's not specified in the P/invoke signature).

I'd avoid returning the array as a function return value. It's easier to marshall it this way as a parameter.

In fact in general, if you want to get away from fixed size buffers you could do it like this:

Delphi

procedure GetInfo(Memadr, Infolen: Integer; Buffer: PByte); stdcall;

Then, to fill out the buffer, you'd need to use some pointer arithmetic or something equivalent.


Need to correct an error in my original post,

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;
0

精彩评论

暂无评论...
验证码 换一张
取 消