zoukankan      html  css  js  c++  java
  • C# 向 C/C++ 库设置 回调函数指针 要注意调用约定方式

    在文章中c# 设置 C++ 回调函数
    中,作者说
    C++中的回调函数必须用_stdcall标记,使用stdcall方式回调

    举例而言,c/cpp 导出的函数多数以 __cdecl 形式,

    typedef  void(*Render)(double* data, BOOL* color);
    

    当在 .Net 中,默认情况下假定任何委托的调用约定为"__stdcall"。在上边链接文章中,作者建议在写 C 库的时候, c/cpp 导出函数使用 "__stdcall" 的方式:

    typedef void(__stdcall *Render)(double* data, BOOL* color);
    但是,我们知道,我们的C lib 一般不宜采用这种形式,这个时候,我们通常采用与非托管代码导出函数相同的调用约定,即 "__cdecl", C# 中采用类似形式:

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void EKFRenderCallback(string data, string colors);
    
    public class EKFLib
    {
        [DllImport("EKFLib.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
        public static extern void SetRenderCallback(EKFRenderCallback render);
    }
    
    public void RenderCallback(string data, string color)
    {
        // rendering
    }
    
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        EKFLib.SetRenderCallback(RenderCallback);
        EKFLib.Init();
    }
    

    关于这一点的链接参阅 StackOverFlow:

    1. 链接1
    2. 链接2
      请去原博主查看更多细节。这里只是供我自己速阅, 感谢博主 Roboby's Home 的 资源。
  • 相关阅读:
    设计模式笔记4(工厂模式)
    设计模式笔记4(工厂模式)
    以前写的东东,放在这里个索引吧
    sicily 1001. Black Magic
    沙漠之旅
    hdu 1395(2^x mod n = 1)
    hdu 2161(Primes)
    sicily 8058. Matrix
    十进制转换为二进制
    硬币水题II
  • 原文地址:https://www.cnblogs.com/gardenofhu/p/13602949.html
Copyright © 2011-2022 走看看