【发布时间】:2016-11-07 14:45:41
【问题描述】:
我有一个用 Delphi 编写的第三方“神秘 dll”(未知版本),delphi 中的工作示例(2009 年过去),迫切需要在我的 C# 代码中使用所述 dll,几乎没有相关知识如何做到这一点.
这是 Delpi 使用此 dll 的示例:
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");
}
}
不幸的是,我遇到了一个错误:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
根据我白天阅读的内容,我可能对返回类型或参数类型进行了编造。帮忙?
【问题讨论】:
-
看起来你的调用约定可能是错误的。我不是 Delphi 专家,但这可能会有所帮助stackoverflow.com/questions/16601423/…
-
Eww,DLL 函数不应该返回任何类型的字符串,这可能会导致问题。
-
有一个希望 - 我想在 Delphi 中创建代理 dll,以与 CSharp 兼容的方式返回数据
-
我问哪个@MBo链接的问题是这个问题的关键