说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

C#调用delphi的dll,如何将函数地址传递给动态库的方法!

编辑:说三道四文库 发布时间:2018-02-20 07:46
HTML文档下载 WORD文档下载 PDF文档下载
liucaihong163 于 2015-06-24 18:22:04 编辑 C#函数地址  delphi动态库 delegate 定义一个函数类型
public delegate void TTestCallBack_EventDataDeleg();
引用delphi动态库注册回调函数方法
 [DllImport("New_ACommLib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern int TestRegCallBack_EventData(TTestCallBack_EventDataDeleg EventDataCallBack);
窗体注册回调函数代码
ACommDll.TTestCallBack_EventDataDeleg tt = new ACommDll.TTestCallBack_EventDataDeleg(TTestCallBack_EventData);
int retu = ACommDll.TestRegCallBack_EventData(TTestCallBack_EventData);
回调函数
private void TTestCallBack_EventData()
        {
            LBoxMess.Items.Add("go");
        }

现在的问题是:每次错误日志都是回调函数为空,不执行TTestCallBack_EventData()这个方法,如何获取C#函数地址传递给delphi动态库呢?
请提供C的代码
 CallingConvention = CallingConvention.Cdecl
不是这里调用方式的问题么?
换成stdcall
引用 1 楼 shingoscar 的回复:
请提供C的代码
C的代码?还是C#的代码
引用 2 楼 mjp1234airen4385 的回复:
 CallingConvention = CallingConvention.Cdecl
不是这里调用方式的问题么?
换成stdcall
调用方式换成stdcall也不行。
C# 的函数变成地址给 DLL 中调用,我是用的 Intptr 类型,如下的代码仅供参考
TTestCallBack_EventDataDeleg f = new TTestCallBack_EventDataDeleg(TTestCallBack_EventData);
IntPtr p = Marshal.GetFunctionPointerForDelegate(f);
TestRegCallBack_EventData(p);
引用 5 楼 tcmakebest 的回复:
C# 的函数变成地址给 DLL 中调用,我是用的 Intptr 类型,如下的代码仅供参考
TTestCallBack_EventDataDeleg f = new TTestCallBack_EventDataDeleg(TTestCallBack_EventData);
IntPtr p = Marshal.GetFunctionPointerForDelegate(f);
TestRegCallBack_EventData(p);
TestRegCallBack_EventData(p);会报错,
引用 3 楼 liucaihong163 的回复:
Quote: 引用 1 楼 shingoscar 的回复:

请提供C的代码
C的代码?还是C#的代码

C的函数声明
引用 6 楼 liucaihong163 的回复:
TestRegCallBack_EventData(p);会报错,

把参数改成 IntPtr 类型啊
[DllImport("New_ACommLib.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int TestRegCallBack_EventData(IntPtr EventDataCallBack);
引用 7 楼 shingoscar 的回复:
Quote: 引用 3 楼 liucaihong163 的回复:

Quote: 引用 1 楼 shingoscar 的回复:

请提供C的代码
C的代码?还是C#的代码

C的函数声明
delphi的动态库,而且是别人提供的,所以看不到源代码的。
问题解决了,动态库提供方忘记给方法TestRegCallBack_EventData声明加stdcall了,结贴,给热心的人散分。
引用 8 楼 tcmakebest 的回复:
Quote: 引用 6 楼 liucaihong163 的回复:

TestRegCallBack_EventData(p);会报错,

把参数改成 IntPtr 类型啊
[DllImport("New_ACommLib.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int TestRegCallBack_EventData(IntPtr EventDataCallBack);
感谢提醒,改成指针后,发现的错误!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘