代码之家  ›  专栏  ›  技术社区  ›  jose

调用回调函数时出现C#异常

  •  3
  • jose  · 技术社区  · 16 年前

    我这样做是为了从C代码中调用非托管函数。PCCallback是一个函数指针,因此托管端是一个委托。

    [DllImport("MyDLL.dll")]
    
    public static extern Result SetCallback(
                IntPtr handle,
                Delegate pCallback,
                CallbackType Type);
    

    现在我要开始了

    private delegate void pfnCallback(uint PromptID, ttsEventType evt, IntPtr lData);
    private pfnCallback cb = new pfnCallback(cback);
    
    public Form1()
    {
    
        (...)
        Wrapper.SetCallback(handle, cb, IntPtr.Zero, CallBackType.DEFAULT);
        (...)
        public static void cback(uint PromptID, ttsEventType evt, IntPtr lData)
        { }
        }
    

    调试时,我看到它运行了一次cback函数,然后我得到一个没有数据的异常,只是说“WindowsApp2.vshost.exe[4372]中发生了一个未处理的win32异常。我不明白怎么了。有人能帮我吗?

    4 回复  |  直到 16 年前
        1
  •  1
  •   Igor    16 年前

    尝试使用

    [UnmanagedFunctionPointer(CallingConvention.xxx, CharSet = CharSet.xxx)]
    public delegate ...
    
        2
  •  2
  •   Mike Mooney    16 年前

    尝试调用Marshal.GetLastWin32Error()以获取Win32错误代码。

    然后将错误代码与此列表进行比较: http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx

    它仍然没有一个好的异常对象那么多信息,但它可能会为您指明正确的方向。

        3
  •  2
  •   Mike Marshall    16 年前

    这里没有太多的细节,但我猜这可能是一个电话会议的问题。在使用DllImport时,我总是尝试显式地设置调用约定;

    [DllImport("msvcrt.dll", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Cdecl)]
    public static extern int printf(String format, int i, double d); 
    

    here

    您必须从非托管库提供的标题或文档中找到正确的约定。

        4
  •  1
  •   Stan R.    16 年前

    您必须确保对回调的引用没有被垃圾收集器收集。对回调的引用必须在托管内存中保持活动状态,直到回调被调用为止。