• C#Stimulator项目>>>C/C++ DLL的生成和调用,Windows下的多线程


    Windows下的多线程

    http://blog.csdn.net/ganpengjin1/article/category/2541791

    使用C/C++建立DLL,环境VS2013

    新建Win32工程,下一步,类型选择DLL

    选中导出符号。不选空项目,让系统生成所需文件。

    为了生成和使用的项目使用同一组头文件,一般使用这样的:

    #ifdef MYLIB_EXPORTS
    #define MYLIB_API __declspec(dllexport)
    #else
    #define MYLIB_API __declspec(dllimport)
    #endif
    

    MYLIB_API的位置:在class 后面,类名的前面

    对于函数,申明和实现,在返回类型前面

    对于全局变量,在extern后面,在变量类型前面。

    DLL中使用回调函数。

    在头文件中申明,比如 typedef  void (CALLBACK *yourfn)(int para);

    在CPP中,一个初始化函数接受yourfn类型的函数指针

    比如 :init(yourfn fn)

    {

    ......

    fn();//调用fn

    }

    外部模块调用DLL的时候,需要写一个类似yourfn的函数,

    void myfn(int hi){......}

    然后调用init(myfn);

    C#调用DLL中的C函数

    建立一个static类,

     using System.Runtime.InteropServices;

    调用形式

    或者这样的:

     [DllImport("dlldemo.dll", EntryPoint = "PassString", CharSet = CharSet.Ansi,  
                        CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]  
            public static extern int PassString(string msg);  
      
     [DllImport("dlldemo.dll", EntryPoint = "Power", CharSet = CharSet.Ansi,  
                        CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]  
            public static extern double Power(double x, int y);  

    在C#修饰符 ref 即表示“传址”,所以C++中的 int*对应于 C#中的ref int

    传递数组:

    在C++中添加函数

    这样调用

     C#调用DLL中C 回调函数

    如果dll需要一个函数指针作为参数,你可以把一个c#的委托传给它,注意参数返回值对应就行

    C#在调用时需要将委托声明为静态的类成员变量。因为委托是托管代码,会被垃圾回收机制回收,

     如果该回调需要数组传参数,还需注意:

    public delegate void CallbackDelegate([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count); 
  • 相关阅读:
    文件上传、下载测试点总结
    selenium+Python(Page Object 设计模式实例)
    Python面向对象
    Python内置函数
    Python异常处理
    Python文件的I/o
    vue-router 二级路由
    vue中如何获取后台数据
    移动端适配问题
    vue中钩子函数的用法
  • 原文地址:https://www.cnblogs.com/legion/p/6265031.html
Copyright © 2020-2023  润新知