2012-08-06 163 views
2

所以我想用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进行通信时遇到了一些问题。

请帮忙。

提前致谢。

+0

更换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

+0

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

+0

像PChar一样,UnmanagedType.LPStr是什么类型?是Unicode还是MBCS?哪个代码页?或者它是随机猜测,取决于编译器选项,如Visual C++中的_T宏? – 2012-08-06 08:49:14

回答

1

不要忘记在C#中调用约定,以及:

[DllImport ("ServerTool.dll"), CallingConvention=CallingConvention.StdCall)] 

您可能还需要根据你使用的德尔福的版本,指定一个字符集。

http://msdn.microsoft.com/en-us/library/7b93s42f.aspxhttp://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx

+0

hm thx for reply。我试过[DllImport(“ServerTool”,CharSet = CharSet.Unicode,CallingConvention = CallingConvention.StdCall)],但仍然失败。 – leegod 2012-08-06 08:47:12

+0

Turbo Delphi Explorer(它是Delphi 2006) – leegod 2012-08-06 08:54:23

+0

然后使用CharSet = CharSet.Ansi,' – GolezTrol 2012-08-06 09:16:24

相关问题