2

だから私は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#からのこのログインの使用には、delphidllの通信に問題があると思います。

助けてください。

少し早いですがお礼を。

4

1 に答える 1

1

C#の呼び出し規約も忘れないでください。

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

使用するDelphiのバージョンに基づいて、CharSetを指定する必要がある場合もあります。

http://msdn.microsoft.com/en-us/library/7b93s42f.aspx およびhttp://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspxを参照してください。

于 2012-08-06T08:25:08.153 に答える