首页 新闻 会员 周边

将委托封送为非托管函数指针传递给非托管DLL之后

0
[已关闭问题] 关闭于 2008-02-06 01:08
目前有个非托管的dll,通过传递函数指针的方式给出了个开发接口。 在DLL内部,源码是这样的,用非托管VC++编写 //////////////////////////// //非托管部分xxxdll.h // 导出函数 //使用DLL的程序可以用自己的函数来处理接受到的数据 typedef void (WINAPI *EVENT_RECIEVE_HANDLE)(char* pData); extern "C" void __declspec( dllexport ) WINAPI _Init(EVENT_RECIEVE_HANDLE erh); //非托管部分xxxdll.cpp EVENT_RECIEVE_HANDLE g_erh = NULL; void WINAPI _Init(EVENT_RECIEVE_HANDLE erh) { // g_erh = erh //注释掉的部分是原程序 下面这条语句是调试时候用的 erh("abc"); // 这里调用了托管代码封送过来的函数指针,但托管的委托函数内只能收到一个元素'a' } //void thradproc(void* data) //{ // g_erh((char*)data); //} //////////////////////////// //托管部分C#程序 class MyClient { // 这里定义一个和c++中函数指针类型对应的委托 public delegate void EVENT_RECIEVE_DELEGATE(byte[] pData); // 一个符合委托的方法 static void event_rec(byte[] pData) { System.Console.WriteLine(pData.Length); //应该输出abc的长度3,却只有1,我跟踪了,数组里面只有a } // DLL导出的函数 [System.Runtime.InteropServices.DllImport("xxxdll.dll", CharSet = System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)] public static extern void _Init([MarshalAs(UnmanagedType.FunctionPtr)] EVENT_RECIEVE_HANDLE erh); static void Main(string[] args) { // 上面的声明使用[MarshalAs(UnmanagedType.FunctionPtr)] 委托封送为一个函数指针, //传递给dll非托管代码 _Init(new EVENT_RECIEVE_DELEGATE(event_rec)); //应该输出abc的长度3,却只有1,我跟踪了,数组里面只有a } } ///////////////////////////////////////////////////////// 哪为高人知道是什么问题导致的?
cloudgamer的主页 cloudgamer | 菜鸟二级 | 园豆:280
提问于:2008-01-26 17:50
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册