【发布时间】:2012-08-06 08:20:10
【问题描述】:
所以我想使用由delphi制作的.dll文件的函数。
这是delphi的代码,
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:=@loginpacket; 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;
}
以上对Login方法的定义都失败了,
并且在运行这部分时(if(stage==1)...Login),unity 崩溃并关闭。
所以我认为这种来自 C# 的登录用法在与 delphi dll 通信方面存在一些问题。
请帮忙。
提前致谢。
【问题讨论】:
-
替换 PChar 类型 - 它只是别名。根据 Delphi 版本,PAnsiChar 指向 8 位前 unicode 数据或 PWideChar 指向 16 位 UCS-2 数据(Java 也可能使用 dotnet),不适合在 DLL 中玩猜谜游戏。 1:用实际的 Delphi 版本标记您的问题。 2:更改某些指针类型的函数头。 2.1:打开类型化指针( {$T+} pragma)。如果代码没有一直玩脏,可能有助于解决此类问题。 3:显示 tLoginPacket 类型的声明。 4:什么是“s:IP_bigstr;”,是字符串还是什么类型?
-
5:显示 DLL 日志内容。特别是在 s:=password; - 记录 s 值。您还可以使用 Windows API OutputDebugString 进行日志记录。一般来说,最好声明 var s_login, s_password: UnicodeString/AnsiString/WideString; - 类型取决于 Delphi 版本和参数指针类型。然后在第一行做 s_login := login; s_password := password; 并且以后只使用字符串变量。并且 - 记录并检查这些变量的值!!!它们会是单字母值,只有每个传递的字符串的第一个字母吗?
-
和 PChar 一样,UnmanagedType.LPStr 是什么类型?是 Unicode 还是 MBCS?哪个代码页?还是随机猜测,取决于 Visual C++ 中的 _T 宏等编译器选项?
-
嗨,delphi 版本是 Turbo Delphi Explorer(它是 Delphi 2006)
-
请编辑问题以添加 dlephi 2006 标签。 delphi 2006 不是基于 unicode 的,所以 PChar 可能是 PAnsiChar。但是,如果 Delphi 升级了,为了避免以后的麻烦,并使代码自文档化,我仍然建议您将它们更改为 PAnsiChar。我还怀疑你只能得到 1 个新字符串的第一个字符。请检查并实施列表中的其他项目。
标签: c# string delphi unity3d delphi-2006