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);
C#Stimulator项目>>>C/C++ DLL的生成和调用,Windows下的多线程的更多相关文章
- Python调用windows下DLL详解
Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...
- Golang调用windows下的dll动态库中的函数
Golang调用windows下的dll动态库中的函数 使用syscall调用. package main import ( "fmt" "syscall" & ...
- Golang调用windows下的dll动态库中的函数 Golang 编译成 DLL 文件
Golang调用windows下的dll动态库中的函数 package main import ( "fmt" "syscall" "time&quo ...
- Delphi 使用之dll文件生成与调用
DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用 ...
- Python调用windows下DLL详解 - ctypes库的使用
在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分数据的交互.使用python中的ctypes模块可以很方便的调用windows的dll(也包括linux下的so等文件),下面将详 ...
- windows下安装node.js及环境配置、部署项目
windows下安装node.js及环境配置.部署项目 一.总结 一句话总结: 安装nodejs软件:就像普普通通的的软件那样安装 配置nodejs安装的全局模块的环境变量 并且安装cnpm(比如cn ...
- C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)
1. 首先,如何制作一个静态库(lib)? 额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件.之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去 ...
- [转] lib和dll 区别,生成及使用方法
lib 和 dll 的区别.生成以及使用详解 [目录] lib dll介绍 生成动态库 调用动态库 生成静态库 调用静态库 首先介绍一下静态库(静态链接库).动态库(动态链接库)的概念,首先两者都是代 ...
- windows下利用dll生成lib
原来工程编译的一些dll库,这次项目需要静态库,偷懒想直接转化.看到网上一些教程,使用VC工具和建立lib项目来实现.有点麻烦.还有一种方法,仅仅利用工具和几条命令转化.来试试看.文章参考harrie ...
随机推荐
- 深度学习算法实践15---堆叠去噪自动编码机(SdA)原理及实现
我们讨论了去噪自动编码机(dA),并讨论了Theano框架实现的细节.在本节中,我们将讨论去噪自动编码机(dA)的主要应用,即组成堆叠自动编码机(SdA),我们将以MNIST手写字母识别为例,用堆叠自 ...
- PHP设计模式之适配器模式
将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本的由于接口不兼容而不能一起工作的那些类可以一起工作.应用场景:老代码接口不适应新的接口需求,或者代码很多很乱不便于继续修改,或者使用第三方类 ...
- php内存申请和销毁
内存申请 ZendMM使用自身heap层申请内存追踪结果: ZEND_ASSIGN_SPEC_CV_CONST_HANDLER (......) -> ALLOC_ZVAL(......) -& ...
- c#指针用法示例。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- 使用WMI监控进程启动与结束
需要添加引用System.Management 代码: static void Main(string[] args) { //创建WQL事件查询,监视进程开启 var qCreate = new W ...
- [HDOJ 5212] [BestCoder Round#39] Code 【0.0】
题目链接:HDOJ - 5212 题目分析 首先的思路是,考虑每个数对最终答案的贡献. 那么我们就要求出:对于每个数,以它为 gcd 的数对有多少对. 显然,对于一个数 x ,以它为 gcd 的两个数 ...
- Android使用pull解析xml
一.理论准备 Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, ...
- 【网络流24题】No. 13 星际转移问题 (网络判定 最大流)
[题意] 由于人类对自然资源的消耗, 人们意识到大约在 2300 年之后, 地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民. 令人意想不到的是, 2177 年冬由于未知的原因, 地球 ...
- Cxf + Spring3.0 入门开发WebService
转自原文地址:http://sunny.blog.51cto.com/182601/625540/ 由于公司业务需求, 需要使用WebService技术对外提供服务,以前没有做过类似的项目,在网上搜寻 ...
- Multi-Die系统介绍
一个典型的存储系统一般是有几片NAND存储器组成的.一般会使用8-bit的总线,用来将不同的存储器与控制器进行连接,如图2.32所示.一个系统中多片NAND的存储系统可以提高存储容量,同时还可以提高读 ...