gpt4 book ai didi

c# - PInvoke 和德尔福

转载 作者:太空宇宙 更新时间:2023-11-03 20:16:05 25 4
gpt4 key购买 nike

我如何在 C# 中使用这个 dll 函数?我尝试了以下但出现错误。“外部组件抛出异常。”

我第一次用 C# 和 Delphi 做这个 PInvoke 的东西。

function HTTPGET(location:string):string; stdcall;
var
HTTP:TIdHttp;
begin
HTTP := TidHttp.Create(nil);
try
result := HTTP.Get(location);
finally
FreeAndNil(HTTP);
end;
end;


exports
HTTPGET;

begin
end.


namespace Test
{
class Program
{
[DllImport("project1.dll")]
public static extern string HTTPGET(string location);

static void Main(string[] args)
{
Console.WriteLine(HTTPGET("http://www.reuters.com/"));
}
}
}

最佳答案

您不能从 C# 调用该函数。那是因为您不能使用 Delphi string 进行互操作。您可以对从托管到非托管的字符串使用 PAnsiChar,但在另一个方向上它更复杂。您需要在调用者处分配内存,或使用共享堆。我更喜欢使用 COM BSTR 最容易完成的后一种方法。这是 Delphi 中的 WideString

一直discussed before ,您不能使用 WideString 作为互操作的返回值,因为 Delphi 使用与 MS 工具不同的 ABI 来返回值。

Delphi 代码需要如下所示:

procedure HTTPGET(URL: PAnsiChar; out result: WideString); stdcall;

在 C# 端,你可以这样写:

[DllImport("project1.dll")] 
public static extern void HTTPGET(
string URL,
[MarshalAs(UnmanagedType.BStr)]
out string result
);

如果您希望 URL 使用 Unicode,则使用 PWideCharCharSet.Unicode

procedure HTTPGET(URL: PWideChar; out result: WideString); stdcall;
....
[DllImport("project1.dll", CharSet=CharSet.Unicode)]
public static extern void HTTPGET(
string URL,
[MarshalAs(UnmanagedType.BStr)]
out string result
);

关于c# - PInvoke 和德尔福,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16637476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com