2014-12-02 71 views
0

我有一些麻烦,从C#传递回调函数到C++非托管DLL。当运行程序时,DLL接收NULL而不是回调。C#/ C++回调传递为NULL

回调函数被定义为

typedef void(__cdecl *CallbackFunction)(); 

的C++函数被定义为

__declspec(dllexport) void __cdecl StreamData(unsigned char *Buffer, unsigned int BufferSize, unsigned long Points, 
unsigned short AveragingPower, CallbackFunction BufferUpdated); 

C#的回调函数委托被定义为

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
private delegate void BufferUpdatedCallback(); 

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
private delegate void StreamDataDelegate(byte[] Buffer, uint BufferSize, ulong Points, 
ushort AveragingPower, BufferUpdatedCallback BufferUpdated); 

的C++函数definitly正确地工作,因为我已经从C++控制台应用程序测试它,并且它工作正常ctly。在C#中,我可以通过Marshal.GetFunctionPointer(Delegate d)获取回调代理的指针,但是当我在进入StreamData函数的位置点过程序时,指针在DLL内部变为NULL。调用约定在DLL和C#委托中是一致的。

我错过了一些非常基本的东西吗?是否有人知道纠正问题的方法?

UPDATE

如果unsigned long Points参数从DLL和C#都删除,然后功能工作正常,否则回调为NULL。

回答

4

an unsigned long在C++编译器中是一个32位整数类型。但是,您声明为ulong,这是一种64位类型。该参数未对齐会导致委托在C++代码中看起来像NULL,它正在读取该ulong变量的高32位。

您必须在Points参数的[DllImport]声明中使用uint

0

尝试这种情况:

私人委托无效StreamDataDelegate(参照字节[]缓冲液,UINT BUFFERSIZE,ULONG点, USHORT AveragingPower,BufferUpdatedCallback BufferUpdated);

+0

数组不是问题,我检查了这个。 – Alex 2014-12-02 15:22:16