现在的位置: 首页 > 综合 > 正文

C# 回调 Delphi Dll 传递字符串

2014年02月23日 ⁄ 综合 ⁄ 共 704字 ⁄ 字号 评论关闭

最近想把一个Delphi 写的项目转成BS,最直接的想法就是把工程改成dll,然后函数调用控制Delphi 的dll,最后Delphi Dll提供回调函数注册,调用C#的函数输出日志和执行信息,这样直接就可以显示到网页了。

第一步就是测试 C# 回调 Delphi Dll 传递字符串,遇到了阻碍

需要注意以下4个方面:


1.参数传递方式:stdcall

注意:不光是你用DllImport引入的dll必须是stdcall,而且你的回调函数也必须是stdcall,这个回调函数的类型控制是在delphi中控制的,声明如下:

type
    TCallBack=procedure (itype:Integer;const TextOut:PChar);stdcall;

C#中的Delegate正常声明就可以了

2.参数类型对应:PChar C#中对应string 、StringBuilder 或IntPtr

事实上,不管是Delphi与C#通信还是与C++通信最好都采用WIN32APIN兼容的类型,毕竟都是Windows一家的,兼容性没的说,而且Delphi的string还要带ShareMem和一个dll,不是一般的麻烦。

注意:Delphi中字符串默认为ANSI编码,一些特殊字符无法显示

IntPtr能用的原因是:PChar本身就是一个指针,传递IntPtr之后可以通过string=Marshal.PtrToStringAnsi(IntPtr) ;得到字符串,而且Unicode也有指定的函数

3.返回值 C# 返回String Delphi 用PChar接收就可以了

4.Delphi Dll Unit中的函数不能直接导出,需要在DllProj 中用全局函数包装一下

抱歉!评论已关闭.