2012-08-06 143 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

相關問題