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

2

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

MyDll.dll

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

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

Каков формат DLLImport для использования в С#?

  • 4
    Кажется, вы извлекли объявление функции из объявления более высокого уровня, возможно, из объявления класса. Я подозреваю, что это из-за зависания type и public слов. Это очень важно знать для правильного определения импорта.
  • 0
    Проверьте эту ссылку: Вызов метода DLL Delphi из кода C #
Теги:
pinvoke

2 ответа

4

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

Delphi

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

procedure GetInfo(Memadr, Infolen: Integer; var Result: TInfo); stdcall;

С#

[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
    +1 однако ... ОП может фактически пытаться экспортировать «Процедуру объекта» и вызывать ее как Процедуру. (Зачем еще он поместил бы публичное ключевое слово прямо над сигнатурой метода).
  • 0
    @Warren Вы не можете экспортировать procedure of object потому что вы не можете экспортировать объекты Delphi. Чтобы экспортировать интерфейс ООП, вы смотрите на COM или непрозрачные дескрипторы для ссылок на объекты.
Показать ещё 3 комментария
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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню