美文网首页系统
dll生成和使用

dll生成和使用

作者: 第八区 | 来源:发表于2017-08-22 13:48 被阅读19次

    dll文件的编译生成

    • 创建项目Win32控制台应用程序


      创建项目1.png
    创建项目2.png
    • 配置属性 项目/属性


      配置属性.png
    • extern "C"关键字
    • 项目结构


      项目目录
    • 源代码
      .h文件
    // 下列 ifdef 块是创建使从 DLL 导出更简单的
    // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLLGENERATE_EXPORTS
    // 符号编译的。在使用此 DLL 的
    // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
    // DLLGENERATE_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
    // 符号视为是被导出的。
    #ifdef DLLGENERATE_EXPORTS
    #define DLLGENERATE_API __declspec(dllexport)
    #else
    #define DLLGENERATE_API __declspec(dllimport)
    #endif
    
    // 此类是从 DllGenerate.dll 导出的
    class DLLGENERATE_API CDllGenerate {
    public:
        CDllGenerate(void);
        // TODO:  在此添加您的方法。
    };
    
    extern DLLGENERATE_API int nDllGenerate;
    
    DLLGENERATE_API int fnDllGenerate(void);
    
    extern "C" DLLGENERATE_API int add(int, int);
    

    .cpp文件

    // DllGenerate.cpp : 定义 DLL 应用程序的导出函数。
    //
    
    #include "stdafx.h"
    #include "DllGenerate.h"
    
    
    // 这是导出变量的一个示例
    DLLGENERATE_API int nDllGenerate=0;
    
    // 这是导出函数的一个示例。
    DLLGENERATE_API int fnDllGenerate(void)
    {
        return 42;
    }
    
    DLLGENERATE_API int add(int x, int y) {
        return x + y;
    }
    
    // 这是已导出类的构造函数。
    // 有关类定义的信息,请参阅 DllGenerate.h
    CDllGenerate::CDllGenerate()
    {
        return;
    }
    
    • 编译生成
    • 结果
      到这里dll文件已经生成完毕


      结果.png
    • 导出dll文件查看。这里使用Viewdll软件
      从结果看到,未加extern "C"的导出函数的函数名被修改了?fnDllGenerate@@YAHXZ
      dll查看.png

    动态调用dll文件

    • 声明头文件<windows.h>,说明我想用windows32方法来加载和卸载DLL
    • 然后用typedef定义一个指针函数类型.typedef int (*OPERATE)(int ,int) 。这个指针类型,要和你调用的函数类型和参数保持一致,记住,是指针参数就是(int ,int)
    • 定一个句柄实例,用来取DLL的实例地址。HINSTANCE hdll;
      格式为hdll=LoadLibrary(“DLL地址”);这里字符串类型是LPSTR,当是unicode字符集的时候会不行,因此要在配置-属性-常规里面把默认字符集“unicode”改成支持多字符扩展即可。
    • 然后通过GetProcAdress来获取函数的地址 ,参数是DLL的句柄和你要调用的函数名
    • 然后通过函数指针来调用函数
    • 最后调用结束后,就释放句柄
    // UseDll.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "Windows.h"
    #include "iostream"
    using namespace std;
    
    typedef int(*OPERATE)(int, int);
    
    int main()
    {
        HINSTANCE hdll;
        hdll = LoadLibrary(_T("D:\\code\\vs\\DllGenerate\\Debug\\DllGenerate.dll"));
        if (hdll == NULL) {
            cout << "load dll failed" << endl;
            getchar();
            return -1;
        }
        else {
            cout << "load dll success!" << endl;
        }
        OPERATE add = NULL;
        add = (OPERATE)GetProcAddress(hdll, "add");
        if (add == NULL) {
            cout << "load add function failed" << endl;
        }
        else {
            int res = add(1, 2);
            cout << res << endl;
        }
        FreeLibrary(hdll);
        getchar();
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:dll生成和使用

        本文链接:https://www.haomeiwen.com/subject/mqcldxtx.html