动态链接库DLL 的静态调用 与 动态调用

自己对于DLL的两种调用方式的理解与做法,若有出错的地方,还望大佬们指出

DLL的动态调用:

首先创建一个DLL的文件,CreateDLL
在CreateDLL.h文件中声明你所需要供其他文件调用的函数:

extern "C" _declspec(dllexport) CREATEDLL_API void printMax(int&,int&);

CREATEDLL_API void printMax(int&,int&);

说明:

(1)前面的 extern “C” 告诉编译器函数可以在本模块或其他模块中使用,其中“C”表明需按照C语言方式编译和连接它,因为C++编译时,会对函数名进行修饰,用于实现函数重载,而C里面没有这个功能,所以需要用extern “C”在头文件进行声明的时候加以区分,以便链接时能进行正确地函数名查找。

(2)_declspec(dllexport)为导出函数关键字,意为需从DLL中导出该函数,以便使用。
(3) printMax 便是自己写的自定义函数了

完成之后在CreateDLL.cpp文件中,添加对printMax函数的定义:

CREATEDLL_API void printMax(int &a,int &b){
    cout<<"the max number is: " <<((a>b)?a:b) << endl;
}

然后便是编译了,编译成功的话会生成一个.dll的文件

调用:

新建一个空的.cpp 项目,填写代码如下:

#include<Windows.h>  
#include<iostream>  
typedef void(*FUNA)(int&,int&);  
typedef void(*FUNB)(int&,int&,int&);  
int main()  
{  
    const char* funName1 = "printMax";  
    int x, y, z;  
    HMODULE hDLL = LoadLibrary(L"CreateDLL.dll");  
    if(hDLL != NULL)  
    {  
        FUNA fp1 = FUNA(GetProcAddress(hDLL,funName1));  
        if(fp1 != NULL)  
        {  
            std::cout<<"Input 2 Numbers:";  
            std::cin>>x>>y;  
            fp1(x,y);  
        }  
        else  
        {  
            std::cout<<"Cannot Find Function "<<funName1<<std::endl;  
        }   
        FreeLibrary(hDLL);  
    }  
    else  
    {  
        std::cout<<"Cannot Find "<<dllName<<std::endl;  
    }  
    return 1;  
}  

说明:

首先typedef 定义一指向void (int&,int&)的函数指针,

HMODULE hDLL = LoadLibrary(L”CreateDLL.dll”); 加载DLL文件,
FUNA fp1 = FUNA(GetProcAddress(hDLL,funName1)); 往DLL文件中取出目标函数
若能够正确取到函数所在地址,直接调用即可完成DLL的动态调用。



静态调用:


静态调用比较简单粗暴,直接将生编译DLL 文件生成的.dll,.lib,.h文件全部拷贝到要调用函数的exe文件所在的目录下,在调用的.cpp文件中把.h头文件添加进来即可完成DLL的静态调用

猜你喜欢

转载自blog.csdn.net/sinat_35866463/article/details/80901327