最简单的dll创建和调用

说好的最简单创建方法,所以这篇文章也会很简单。
我折腾了一晚上和半个下午,好不容易才解决了一大堆麻烦的问题,提炼出了网上各种麻烦代码的主要步骤

我一共用了两个文件:
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

本站文章未经文下加注授权不得拷贝发布。

本博客使用Disqus评论系统,如果看不到评论框,请尝试爬墙。