所以我想用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進行通信時遇到了一些問題。
請幫忙。
提前致謝。
更換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