【问题标题】:Delphi dll function to C#Delphi dll函数到C#
【发布时间】:2011-07-14 11:03:07
【问题描述】:

使用已编译的 Delphi dll,声明的函数之一是

Mydll.dll

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

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

在 C# 中使用它的 DLLImport 格式是什么?

【问题讨论】:

  • 您似乎从更高级别的声明中提取了函数声明,可能是类声明。我怀疑这是因为挂了typepublic 字样。了解适当的导入定义非常重要。

标签: c# delphi pinvoke


【解决方案1】:

我会这样做:

德尔福

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 签名中没有指定它的原因)。

我会避免将数组作为函数返回值返回。以这种方式将其编组为参数更容易。

事实上,一般来说,如果你想摆脱固定大小的缓冲区,你可以这样做:

德尔福

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

然后,要填充缓冲区,您需要使用一些指针算法或等效的东西。

【讨论】:

  • +1 然而...... OP实际上可能正在尝试导出“对象过程”并将其称为过程。 (否则他为什么会在他的方法签名上方放置一个 public 关键字)。
  • @Warren 你不能导出 procedure of object 因为你不能导出 Delphi 对象。要导出 OOP 接口,您需要查看 COM 或对象引用的不透明句柄。
  • 当然你不能,我知道,但我想知道 OP 的“示例代码”中的“公共”试图告诉我们什么......公共不是有效的关键字在顶层单元范围内。这表明 OP 混乱。
  • @David:我同意沃伦的观点。看起来代码不是他实际使用的原始代码。那里有一个“公共”的事实可能意味着他从实际的类声明中提取了该代码。如果他真的想导出一个方法,你描述的当然行不通。
  • @rudy @warren 你可能是对的。我假设该块是字节缓冲区的处理。
【解决方案2】:

需要纠正我原来帖子中的一个错误,

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多