C++生成dll和调用dll的方法实例
本人根据网络多个相关博客帖子原创
1)生成dll
建立两个文件 xxx.h , xxx.cpp
xxx.h内容如下:
#ifdef BUILD_XXX_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
extern "C"{
EXPORT void example(void);
... ...
}
xxx.cpp内容如下:
#define BUILD_XXX_DLL
#include "xxx.h"
void example(void)
{
}
... ...
然后从DOS控制台进行编译(假设已经安装mingw并加入环境变量)
g++ -shared -Wl,--kill-at,--output-def,xxx.def -o xxx.dll xxx.cpp
(因为C++通过修饰函数名来实现函数重载,所以我们要用extern "C"配合--kill-at编译选项来避免对函数名的修正,BUILD_XXX_DLL宏的作用是用来选择函数原型声明的作用)
2)静态调用dll
在新文件yyy.cpp里加入如下内容;
#include "xxx.h"
#pragma comment(lib,"xxx.dll")
生成的dll不需要def文件和cpp文件也可以
不包含xxx.h的话,需要把h文件内的函数原型声明添加进yyy.cpp
编译时需要加入dll,类似这样:
g++ -L. -o yyy.exe yyy.cpp xxx.dll
3)动态调用dll
首先,你需要包含windows.h
#include <windows.h>
你还需要一个句柄保存装入的dll文件
HINSTANCE hDll=LoadLibrary("xxx.dll");
声明所需函数的对应函数指针类型
typedef void (*pfunc)(void);
获得指向函数的函数指针
pfunc pf=(pfunc*)GetProcAddress(hDll,"example");
使用完毕后,要释放dll文件
FreeLibrary(hDll);
相关推荐
-
C++二叉树结构的建立与基本操作
准备数据定义二叉树结构操作中需要用到的变量及数据等. 复制代码 代码如下: #define MAXLEN 20 //最大长度typedef char DATA; //定义元素类型struct CBTType //定义二叉树结点类型 { DATA data; //元素数据 CBTType * left; //左子树结点指针 CBTType * right; //右子树结点指针 }; 定义二叉树结构数据元素的类型DA
-
c++ vector(向量)使用方法详解(顺序访问vector的多种方式)
vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器.vector 是C++ STL的一个重要成员,使用它时需要包含头文件: 复制代码 代码如下: #include<vector>; 一.vector 的初始化:可以有五种方式,举例说明如下: (1) vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的.(2)vector<int> a(10,
-
浅析C++中结构体的定义、初始化和引用
定义:结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构. 声明一个结构体类型的形式是: 复制代码 代码如下: struct Student{ //声明一个结构体类型Student int num; //声明一个整形变量num char name[20]; //声明一个字符型数组name char sex; //声明一个字符型变量sex int age; //声明一个整形变量age float
-
C++中的哈希容器unordered_map使用示例
随着C++0x标准的确立,C++的标准库中也终于有了hash table这个东西. 很久以来,STL中都只提供<map>作为存放对应关系的容器,内部通常用红黑树实现,据说原因是二叉平衡树(如红黑树)的各种操作,插入.删除.查找等,都是稳定的时间复杂度,即O(log n):但是对于hash表来说,由于无法避免re-hash所带来的性能问题,即使大多数情况下hash表的性能非常好,但是re-hash所带来的不稳定性在当时是不能容忍的. 不过由于hash表的性能优势,它的使用面还是很广的,于是第三方
-
C++常用字符串分割方法实例汇总
本文实例汇总了C++常用字符串分割方法,分享给大家供大家参考.具体分析如下: 我们在编程的时候经常会碰到字符串分割的问题,这里总结下,也方便我们以后查询使用. 一.用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串. 参数说明:str为要分解的字符串,delim为分隔符字符串. 返回值:从str开头开始的一个个被分割的串.当没有被分割的串时则返回NULL. 其它:strtok函数线程不安全
-
深入理解C++中public、protected及private用法
初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及private用法.相信对于大家深入掌握C++程序设计会有很大的帮助. 这里我们首先要明白下面几点. 1.类的一个特征就是封装,public和private作用就是实现这一目的.所以: 用户代码(类外)可以访问public成员而不能访问private成员:private成员只能由类成员(类内)和友元访问.
-
浅析C/C++中sort函数的用法
sort是STL中提供的算法,头文件为#include<algorithm>以及using namespace std; 函数原型如下: template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIterator, class Compare> void sor
-
基于C++全局变量的声明与定义的详解
(1)编译单元(模块)在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作:第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件:第二步,将工程中所有的obj文件进行LINK,生成最终.exe文件.那么,错误可能在两个地方产生:一个,编译时的错误,这个主要是语法错误:一个,链接时的错误,主要是重复定义变量等.编译单元指在编译阶段生成的每个obj文件.一个obj文件就是一个编译单元.一个.cpp(.c)和它相应的.h文件共同组成了一个编译单元.一个工程由很多编译
-
c++中.dll与.lib文件的生成与使用的详解
c++中.dll与.lib文件的生成与使用的详解 -------------------------------------------------------------------------------- 两种库: • 包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.• 包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library.共有两种链
-
C++中函数模板的用法详细解析
定义 我们知道函数的重载可以实现一个函数名多用,将功能相同或者类似函数用同一个名来定义.这样可以简化函数的调用形式,但是程序中,仍然需要分别定义每一个函数. C++提供的函数模板可以更加简化这个过程. 所谓函数模板实际上是建立一个通用函数,其涵涵素类型额形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板. 凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次即可.在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能
-
C++基础教程之指针拷贝详解
C++基础教程之指针拷贝详解 指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此.特别是在C++中,如果不注意处理类中的指针,非常容易出问题.如果朋友们不相信可以看看下面的代码: class data { int* value; public: data(int num){ if(num > 0) value = (int*)malloc(sizeof(int)* num); } ~data(){ if(value) free(value); } }; void proces
-
C语言/C++中如何产生随机数
C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数. 需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib.h;而使用time()函数需要引入ctime头文件. 使用rand()函数获取一个随机数如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdlib.h, 其值为2147483647. 例子
随机推荐
- Lua中算术运算符的使用示例
- 48个英语音标表-附一个flash实现的音标的读音
- Android编程实现获取标题栏、状态栏的高度、屏幕大小及模拟Home键的方法
- python利用beautifulSoup实现爬虫
- 举例讲解Django中数据模型访问外键值的方法
- 判断脚本加载是否完成的方法
- 利用js读取动态网站从服务器端返回的数据
- .Net下的签名与混淆图文分析
- WordPress中用于获取文章作者与分类信息的方法整理
- 浅析c/c++中函数的参数传递
- 解析Android获取系统cpu信息,内存,版本,电量等信息的方法详解
- PHP empty函数报错解决办法
- Java简单统计字符串中汉字,英文字母及数字数量的方法
- ruby 一些简单的例子
- 利用ssh tunnel链接mysql服务器的方法
- Java编程实现递增排序链表的合并
- JavaScript 读取元素的CSS信息的代码
- jQuery实现6位数字密码输入框
- XMLHttpRequest处理xml格式的返回数据(示例代码)
- 两个INPUT同步输入的方法小结 兼容IE和firefox