您的位置:首页 > 编程语言 > C语言/C++

C/C++动态链接库的创建和使用,显式调用

2013-04-01 16:14 369 查看
1,创建动态链接库在VS2008中,首先创建一个项目,

选择win32应用程序,点击确定,下一步选择应用程序类型:DLL,附加选项是:空选项

在这个项目中创建一个头文件:CustomDll.h

#ifdef CustomDLL_EXPORTS  
#define CustomDLL_API_declspec(dllexport)  
#else  
#define CustomDLL_API_declspec(dllimport)  
#endif  
 
//声明自定义导出函数  
int DLLFuncAdd(int a,int b); 

在项目中创建一个源文件CustomDll.cpp

#include "CustomDll.h"  
#include <Windows.h>  
//DllMain函数 就是动态链接库的入口点,windows在库装载,卸载,线程创建和结束的时候都要调用入口函数,  
//以便动态链接库可以采取相应的动作。  
 
 
//hMODULE是该DLL模块的句柄,代表这个文件的映像加载到进程的地址空间时使用的基地址。  
//ul_reason_for_call参数的值表示本次调用的原因,取值:  
//   DLL_PROCESS_ATTACH被加载的时候  
//   DLL_PROCESS_DETACH被卸载的时候  
//   DLL_THREAD_ATTACH应用程序创建了一个新的线程  
//   DLL_THREAD_DETACH某个线程正常终止  
BOOL APIENTRY DllMain( HMODULE hMODULE, DWORD ul_reason_for_call, LPVOID IpReserved)  
{  
    switch (ul_reason_for_call)  
    {  
        //动态链接库被映射到某个进程的地址空间  
    case  DLL_PROCESS_ATTACH:  
        //应用程序创建新的县城  
    case DLL_THREAD_ATTACH:  
        //应用程序某个线程正常终止  
    case DLL_THREAD_DETACH:  
        //动态链接库将被卸载  
    case DLL_PROCESS_DETACH:  
        break;  
    }  
    return true;  
}  
//自定义导出函数,求两个整数的和  
int DLLFuncAdd(int a,int b){  
    return a+b;  


在项目中新建文件.def 文件,把DLL定义为导出函数CustomDll.def

EXPORTS  
DLLFuncAdd 

点击生成-->>生成解决方案 会生成一个 C++Dll.dll的动态链接库文件,下面介绍这个动态链接库的显示调用:首先把C++Dll.dll和要调用的程序放在同一个目录:AppMain.cpp

#include <iostream>  
#include <Windows.h>  
using namespace std;  
 
//声明DLL里的函数原型  
typedef int (*PFNEXPORTFUNC)(int,int);  
 
int main(){  
    int c = 12 ,d=20;  
    int result;  
 
    //加载目标DLL,利用LoadLibary()函数加载指定目录下的DLL库到进程的虚拟地址空间,函数执行成功的话,返回此DLL模块的句柄  
    //否则返回NULL  
    //LoadLibary的函数声明  
    //HMODULE WINAPI  
    //LoadLibrary(  
    //  LPCTSTR lpFileName  
    //);  
 
    HMODULE hMODULE = LoadLibrary(TEXT("c++_dll.dll"));  
    if(hMODULE!=NULL){  
        PFNEXPORTFUNC mDLLfuncAdd = (PFNEXPORTFUNC)  
                GetProcAddress(hMODULE,"DLLFuncAdd");// GetProcAddress这个函数来获得目标DLL中导出函数的地址  
        //GetProcAddress函数的声明  
        //FARPROC GetProAddress(  
        //  HMODULE hMOULE,  
        //  LPCSTR lpProcName  
        //  );  
        if(mDLLfuncAdd!=NULL){  
            result = mDLLfuncAdd(c,d);  
            cout<<result<<endl;  
        }  
        //释放链接库占用的资源  
        FreeLibrary(hMODULE);  
    }  
 
    
4000
int t;  
    cin>>t;  
    return 0;  
}  

 
本文出自 “Kenan_ITBlog” 博客,请务必保留此出处http://soukenan.blog.51cto.com/5130995/1077698
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: