加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

从C#代码调用delphi DLL函数

发布时间:2020-12-15 17:14:14 所属栏目:百科 来源:网络整理
导读:我有一个在Delphi 2007中编译的DLL和一个在其他Delphi项目中使用它的例子.这是代码的一部分: TErrorCallback = function(Msg:PChar):byte of object;TSaveEventCallback = function (Line:PChar; HiCode:PChar; LoCode:PChar; MobileNo:PChar):byte of obje
我有一个在Delphi 2007中编译的DLL和一个在其他Delphi项目中使用它的例子.这是代码的一部分:
TErrorCallback = function(Msg:PChar):byte of object;
TSaveEventCallback = function (Line:PChar; HiCode:PChar; LoCode:PChar; MobileNo:PChar):byte of object;

function InitModule(ErrorCallback:TErrorCallback; SaveEventCallback :TSaveEventCallback; MainWindowHandle:THandle; Sock_Event:integer):byte; stdcall; external 'My.dll' name 'InitModule';

function DLLSocketEvent(var msg: TMessage): byte; stdcall; external 'My.dll' name 'DLLSocketEvent';

function InitObjList(Objs: array of PChar; NumObjs: byte; Name: PChar):byte; stdcall; external 'My.dll' name 'InitObjList';

这是我的C#模拟:

class Message
{
  unsigned int msg;
  int wParam;
  int lParam;
  int result;
};
delegate byte ErrorCallbackDelegate(string msg);
delegate byte SaveEventCallbackDelegate(string line,string hiCode,string loCode,string mobileNo);

[DllImport("My.dll")]
static extern byte InitModule(ErrorCallbackDelegate errorCallback,SaveEventCallbackDelegate saveEventCallback,IntPtr mainWindowsHandle,Int32 sockEvent);

[DllImport("My.dll")]
static extern byte DllSocketEvent(Message msg);

[DllImport("My.dll")]
static extern byte InitObjList(string[] objs,byte numObjs,string name);

关键是我只尝试过InitModule方法并抛出异常:
对PInvoke函数’ProjTest!ProjTest.MyClass :: InitModule’的调用使堆栈失衡.这很可能是因为托管的PInvoke签名与非托管目标签名不匹配.检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配.

请在这件事上给予我帮助.我应该如何在C#中描述这些DLL函数?

解决方法

你不能从C#调用该DLL.主要问题是两个对象回调.在C#中没有办法匹配它.您将需要修改现有的DLL或添加中间适配器DLL.目前,您的DLL只能从Delphi或C Builder访问.

如果您可以修改DLL,那么您需要进行的修改是删除对象.如果需要回调来对实例执行操作,则需要将实例作为参数传递.但是,C#委托可以透明地包装所有内容,因此如果您需要从其他语言访问DLL,您只需将实例作为参数传递,例如,德尔福.

另一个问题是open数组参数.这也不容易从其他语言访问.虽然有tricks,但我建议将引用传递给第一个元素而不是开放数组.开放数组是Delphi独有的.

我也不明白你为什么使用字节类型来保存数组长度.你应该使用Integer.使用byte没有任何好处,你只需要邀请溢出.另外,MainWindowHandle不应该是Delphi中的THandle.它应该是HWND.

我对你的建议是修改DLL以具有C兼容接口,因此可以从支持它的所有语言访问.在实践中,这将使其可以从所有主流编程语言访问.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读