Функция Delphi DLL для C # - PullRequest
       24

Функция Delphi DLL для C #

2 голосов
/ 14 июля 2011

При использовании скомпилированной библиотеки Delphi одна из объявленных функций:

Mydll.dll

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

type
 public
   function GetInfo(Memadr, Infolen: Integer): TInfo;

Какой формат DLLImport используется в C #?

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

Я бы сделал это так:

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;

Затем, чтобы заполнить буфер, вам нужно будет использовать некоторую арифметику указателей или что-то эквивалентное.

0 голосов
/ 18 июля 2011

Нужно исправить ошибку в моем исходном посте,

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