说好的最简单创建方法,所以这篇文章也会很简单。
我折腾了一晚上和半个下午,好不容易才解决了一大堆麻烦的问题,提炼出了网上各种麻烦代码的主要步骤
我一共用了两个文件:
2.cpp 生成2.dll文件
3.cpp 生成3.exe文件
这里省去了大部分教程里都要求包含的头文件
首先就是创建dll
extern "C"{ //函数列表 void miao(); //miao函数 } void miao(){ //一个没有实现任何功能的miao函数 //代码 }
这就是一个dll的代码了,我是用g++编译的,所以在vim里输入
:!g++ --share 2.cpp -o 2.dll
回车,即可编译出一个dll文件了。
如果用的是图形界面IDE比如VS之类就更方便了,直接创建一个链接库工程,写好代码以后按F5编译
以上就已经创建了一个dll了
然后我们来做一个调用dll的exe:
3.cpp里的内容
#include using namespace std; typedef void (*fun)(); //定义需要的函数类型 int main(){ HMODULE dll2; //句柄 fun a; //定义a为指定类型的函数 dll2 = LoadLibrary("2.dll"); //加载2.dll,句柄放进dll2 if((a = (fun)GetProcAddress(dll2,"miao") )!=NULL){ //必要的if,没有的话如果出了意外仍然调用里面的函数会导致程序崩溃。GetProcAddress来找到指定函数的地址 a(); } system("pause"); //暂停一下 FreeLibrary(dll2); //释放dll2句柄 return 0; }
然后vim里打
:!g++ 3.cpp -o 3
回车编译
同样用VS的按F5。
然后打开3.exe,这时已经是一个完整的可以加载dll的程序了,当然看不出任何效果。
所以举个可以看得出来的完整例子
//2.cpp #include using namespace std; extern "C"{ void miao(); } void miao(){ cout<<"miao"<<endl; } //3.cpp #include using namespace std; typedef void (*fun)(); int main(){ HMODULE dll2; fun a; dll2 = LoadLibrary("2.dll"); if((a = (fun)GetProcAddress(dll2,"miao") )!=NULL){ a(); } system("pause"); FreeLibrary(dll2); return 0; }
编译并运行以后可以输出”miao”,这就成功了。
我用的是即用即调的dll加载方式,适用特大工程不需要一下加载所有dll的情况。
本文发布于 https://luojia.me
本站文章未经文下加注授权不得拷贝发布。
留言是美德,可我看不懂啊。主要是不想学编程:)
没关系看不懂可以不留言嘛。。。在看得懂的文章留言就行了● ω ●)/~☆