【发布时间】:2015-01-13 10:26:38
【问题描述】:
-
从 C# 调用的 WIN32 函数:
int PTSetGUICallbacks ( IN int hConnection, IN void *pGuiStreamingCallbackCtx, IN PT_GUI_STATE_CALLBACK pfnGuiStateCallback, IN void *pGuiStateCallbackCtx ) -
Win32回调函数原型“PT_GUI_STATE_CALLBACK”:
int PT_STD_GUI_STATE_CALLBACK ( IN DWORD dwGuiState, OUT BYTE *pbyResponse, IN DWORD dwMessage ) -
我的 C# 函数用于在内部调用上述 Win32 函数,我将 C# 函数作为回调传递给该 Win32 函数:
public void SetCallback() { var callback_delegate = new PT_GUI_STATE_CALLBACK(GUI_STATE_CALLBACK); GCHandle gch = GCHandle.Alloc(callback_delegate); IntPtr intptr_delegate = Marshal.GetFunctionPointerForDelegate(callback_delegate); int mErrorCode = PTSetGUICallbacks(mDevHandle, IntPtr.Zero, intptr_delegate, IntPtr.Zero); gch.Free(); }
这段代码不起作用,我的意思是我没有从 win32 api 回调到我的 C# 方法 (GUI_STATE_CALLBACK)
所以现在我需要将该回调从我的 C# 函数传递给 win32 api。
有人知道答案吗?
-
WIN32 api的PInvoke函数声明:
公共静态外部 int PTSetGUICallbacks(int ahConnection,
IntPtr aStreamingcbCtx, IntPtr aGuiStateCb, IntPtr aGuiStateCbCtx);
这有什么更新吗?
还有其他替代方法吗?
【问题讨论】:
-
目前无法让您的代码匹配 - 在 1) 您显示一个具有 4 个参数的函数,在 3) 用 5 个参数调用相同的函数。
-
谢谢 damien,非常抱歉,我打错了,我现在改了。请查看它。谢谢
-
仅仅基于命名,我有一种预感,你不应该在调用
PTSetGUICallbacks之后立即调用gch.Free()- 这听起来像是在注册某种可能在之后调用的函数PTSetGUICallbacks函数已返回 - 在这种情况下,只要可能发生回调,您就需要让 GCHandle 保持活动状态 - 大概直到您“取消设置”回调或关闭任何可能使用该回调的东西。这是否是 问题,我无法确定(正如我所说,这只是基于命名的猜测)
标签: c#