gpt4 book ai didi

c# - 在 C# 中使用 Delphi DLL

转载 作者:太空狗 更新时间:2023-10-29 21:32:37 25 4
gpt4 key购买 nike

我有一个用 Delphi 编写的第三方“神秘 dll”(未知版本),Delphi 中的工作示例(过去 2009 年),迫切需要在我的 C# 代码中使用所述 dll,并且几乎没有关于如何做的相关知识.

以下是使用此 dll 的 Delpi 示例:

type
TD_Query = function(host: WideString; port : Word;pud,query : WideString):WideString; stdcall;
procedure TForm11.Button6Click(Sender: TObject);
var
Handle : LongWord;
D_Query : TD_Query;
sss : WideString;
begin

Handle := LoadLibrary('kobrasdk.dll');
sss:='';
if Handle <> 0 then
begin
@D_Query := GetProcAddress(Handle, 'D_Query');
sss:=D_Query('host',8201,'pud','query');
FreeLibrary(Handle);
end;
end;

这是我用 C# 解释它的尝试:

class Program
{
[DllImport("C:\\Games\\kobrasdk.dll", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string D_Query(string host, ushort port, string pud, string query);


static void Main(string[] args)
{
D_Query("test", 8201, "test", "test");
}
}

不幸的是,我得到的是一个错误:试图读取或写入 protected 内存。这通常表明其他内存已损坏。

根据我白天阅读的内容,我可能搞砸了返回类型或参数类型。帮忙?

最佳答案

Delphi ABI 在某些类型上不同于 Microsoft ABI。 Delphi WideString 是一种托管类型(在 Delphi 术语中)并且作为返回类型使用与 Microsoft 工具不兼容的 ABI。

Delphi ABI 将托管返回类型转换为隐藏的 var 参数。所以编译器转换:

function(host: WideString; port: Word; pud, query: WideString): WideString; stdcall;

进入

procedure(var result: WideString; host: WideString; port: Word; pud, query: WideString); 
stdcall;

因此,您可以通过以转换后的形式导入函数,从 C# 访问原始的 Delphi 函数。

[DllImport(@"...", CallingConvention = CallingConvention.StdCall)]
public static extern void My_D_Query(
[MarshalAs(UnmanagedType.BStr)]
out string result,
[MarshalAs(UnmanagedType.BStr)]
string host,
ushort port,
[MarshalAs(UnmanagedType.BStr)]
string pud,
[MarshalAs(UnmanagedType.BStr)]
string query
);

关于c# - 在 C# 中使用 Delphi DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38208928/

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