Mor*_*owk 6 c# delphi dllimport
我有一个用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;
Run Code Online (Sandbox Code Playgroud)
这是我尝试用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");
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我所拥有的是一个错误:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.
从我白天阅读的内容来看,我可能会对返回类型或参数类型进行捏造.救命?
对于某些类型,Delphi ABI与Microsoft ABI不同.Delphi WideString是一种托管类型(在Delphi术语中),并且返回类型使用与Microsoft工具不兼容的ABI.
Delphi ABI将托管返回类型转换为隐藏var参数.所以编译器转换:
function(host: WideString; port: Word; pud, query: WideString): WideString; stdcall;
Run Code Online (Sandbox Code Playgroud)
成
procedure(var result: WideString; host: WideString; port: Word; pud, query: WideString);
stdcall;
Run Code Online (Sandbox Code Playgroud)
因此,您可以通过导入转换后的伪装中的函数从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
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2650 次 |
| 最近记录: |