【问题标题】:How to Pass Callback argument for Win32 Dll api from C# function?如何从 C# 函数传递 Win32 Dll api 的回调参数?
【发布时间】:2015-01-13 10:26:38
【问题描述】:
  1. 从 C# 调用的 WIN32 函数:

    int PTSetGUICallbacks (  
      IN int hConnection,
      IN void *pGuiStreamingCallbackCtx,
      IN PT_GUI_STATE_CALLBACK pfnGuiStateCallback,
      IN void *pGuiStateCallbackCtx
    )
    
  2. Win32回调函数原型“PT_GUI_STATE_CALLBACK”:

    int PT_STD_GUI_STATE_CALLBACK (
      IN DWORD dwGuiState,
      OUT BYTE *pbyResponse,
      IN DWORD dwMessage
    )
    
  3. 我的 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。

有人知道答案吗?

  1. WIN32 api的PInvoke函数声明:

    公共静态外部 int PTSetGUICallbacks(int ahConnection,
    IntPtr aStreamingcbCtx, IntPtr aGuiStateCb, IntPtr aGuiStateCbCtx);

这有什么更新吗?

还有其他替代方法吗?

【问题讨论】:

  • 目前无法让您的代码匹配 - 在 1) 您显示一个具有 4 个参数的函数,在 3) 用 5 个参数调用相同的函数。
  • 谢谢 damien,非常抱歉,我打错了,我现在改了。请查看它。谢谢
  • 仅仅基于命名,我有一种预感,你不应该在调用PTSetGUICallbacks 之后立即调用gch.Free() - 这听起来像是在注册某种可能在之后调用的函数PTSetGUICallbacks 函数已返回 - 在这种情况下,只要可能发生回调,您就需要让 GCHandle 保持活动状态 - 大概直到您“取消设置”回调或关闭任何可能使用该回调的东西。这是否是 问题,我无法确定(正如我所说,这只是基于命名的猜测)

标签: c#


【解决方案1】:

将您的回调函数定义为“回调”

public static extern int PTSetGUICallbacks(
int ahConnection,IntPtr aStreamingcbCtx, 
CallBack aGuiStateCb, IntPtr aGuiStateCbCtx);

调用它:

CallBack cb = new CallBack(GuiCBFunction);
PTSetGUICallbacks(mDevHandle, IntPtr.Zero, cb,  IntPtr.Zero);

c#中的回调:

int GuiCBFunction (UInt32 dwGuiState, IntPtr pbyResponse, UInt32 dwMessage )

“回调”示例:http://msdn.microsoft.com/de-de/library/a95009h1%28v=vs.80%29.aspx

【讨论】:

  • 我之前尝试过,但它也不起作用。我没有在我的 C# 回调函数中收到调用。还有其他方法可以尝试吗?
  • 是否返回了errorCode?也许连接句柄出了点问题。您是否获得/可以启用来自软件的任何调试日志(您正在使用 API)记录是否调用回调?
  • 另一种方法是为它编写一个 C++ CLI ClassLibrary Wrapper。
猜你喜欢
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2013-02-07
相关资源
最近更新 更多