如何将字符串从C#传递给delphi的dll函数?
问题描述:
所以我想用delphi制作的.dll文件的功能。如何将字符串从C#传递给delphi的dll函数?
这里是德尔福的代码,
procedure Login(login,password:PChar); stdcall;
var
LoginPacket:tLoginPacket;
s:IP_bigstr;
q,w:integer;
pb:PByte;
begin
LogMessage('Login: '+login+' pwd: '+password);
fillchar(loginpacket,sizeof(loginpacket),0);
LoginPacket.code:=10;
LoginPacket.lr.version:=100;
LoginPacket.lr.protocol:=ProtocolVersion;
LoginPacket.lr.login:=login;
LoginPacket.lr.gameversion:=version;
s:=password;
EncryptPwd(s,@loginPacket.lr.pwd);
Loginpacket.lr.pwdhash:=PasswordHash(password);
LoginPacket.lr.gameID:=0;
LoginPacket.lr.regname:='noname';
LoginPacket.lr.cdkey:=0;
LoginPacket.lr.cshash:=0;
loginpacket.lr.sversion:='';
pb:[email protected]; inc(pb);
for q:=1 to sizeof(tloginpacket)-1 do begin
pb^:=pb^ xor ((q+10)*(q+10) div 5);
inc(pb);
end;
SendData(@loginpacket,sizeof(loginpacket));
SimpleRequest(21,1,0);
SimpleRequest(20,0,0);
end;
,这里是我的C#(unity3d)试试,
[DllImport ("ServerTool")]
private static extern void Login([MarshalAs(UnmanagedType.LPStr)]string id, [MarshalAs(UnmanagedType.LPStr)]string pass);
private static extern void Login(string id, string pass);
...
if(stage ==1){
Login("Test", "qwerty");
stage = 2;
}
两个定义登录方法失败以上,
并运行了此部分时(如果(阶段== 1)...登录),统一崩溃并关闭。
所以我认为这个来自C#的登录用法在与delphi dll进行通信时遇到了一些问题。
请帮忙。
提前致谢。
答
不要忘记在C#中调用约定,以及:
[DllImport ("ServerTool.dll"), CallingConvention=CallingConvention.StdCall)]
您可能还需要根据你使用的德尔福的版本,指定一个字符集。
见http://msdn.microsoft.com/en-us/library/7b93s42f.aspx 和http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx
更换PChar类型类型 - 这是唯一的别名。根据德尔福版本,它会是指向8位unicode数据的PAnsiChar或指向16位UCS-2数据(以及由Java使用的数据,也可能是dotnet)的PWideChar,不适合在DLL中玩猜谜游戏。 1:用实际的Delphi版本标记你的问题。 2:更改某些指针类型的函数头。 2.1:打开键入的指针({$ T +} pragma)。如果代码没有全部弄脏,可能会帮助解决这些问题。 3:显示tLoginPacket类型的声明。 4:什么是“s:IP_bigstr;”,它是字符串还是什么类型? – 2012-08-06 08:41:18
5:显示DLL日志内容。 特别是在s:=密码后; - 记录s值。 您还可以使用Windows API OutputDebugString进行日志记录。 一般来说,最好是声明* var s_login,s_password:UnicodeString/AnsiString/WideString; * - 取决于Delphi版本和参数指针类型。然后用第一行做* s_login:= login; s_password:=密码; *并且仅在之后使用字符串变量。并且 - 做日志并检查这些变量的值!他们会是一个单字母值,只有每个传递字符串的第一个字母? – 2012-08-06 08:45:11
像PChar一样,UnmanagedType.LPStr是什么类型?是Unicode还是MBCS?哪个代码页?或者它是随机猜测,取决于编译器选项,如Visual C++中的_T宏? – 2012-08-06 08:49:14