c# - 如何将字符串从 C# 传递给 delphi dll 函数?

标签 c# string delphi unity3d delphi-2006

所以我想用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;
}

以上两个登录方法的定义都失败了,

并且在运行这部分时(if(stage==1)...Login),unity 崩溃并关闭。

所以我认为这种来自 C# 的登录用法在与 delphi dll 通信时存在一些问题。

请帮忙。

提前致谢。

最佳答案

也不要忘记 C# 中的调用约定:

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

您可能还需要根据您使用的 Delphi 版本指定一个 CharSet。

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

关于c# - 如何将字符串从 C# 传递给 delphi dll 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11824738/

相关文章:

c# - 图问题的算法

android - 如何忽略 Android Studio Log 中的所有硬编码字符串?

javascript - chrome 控制台上没有显示任何内容,从表单中获取信息

Delphi Spring框架注册泛型类型

android - 使用 Firemonkey 在 android 中获取设备电子邮件地址

Delphi:SetFileDate 创建错误的 LastWriteTime(夏季/冬季)

c# - DataGridView 数据绑定(bind)到 List<List<T>>

c# - 我的应用程序如何查找旧版本的辅助文本文件?

javascript - 如何在C#中网页从一个页面导航到另一个页面时执行代码

java - 在 Java 中高效格式化字符串数组