zoukankan      html  css  js  c++  java
  • dll动态链接库导出函数方法 -- 动态导出(.def文件导出)

    简介

    动态链接库最大的优势在于可以提供给其他应用程序共享的资源,最小化应用程序代码的复杂度,其中一个十分重要的功能就是dll可以导出封装函数的功能。导出函数有两种主要方式,分别是静态导入动态导入,本文主要介绍动态导入功能。

    方法解析

    (1)创建DLL动态链接库项目
    创建DLL动态链接库项目

    (2)在DllMain函数的上方或下方创建一个自定义函数(样例使用ShowMessageBox函数)

    // dllmain.cpp : 定义 DLL 应用程序的入口点。
    #include "stdafx.h"
    
    BOOL APIENTRY DllMain(HMODULE hModule,
        DWORD  ul_reason_for_call,
        LPVOID lpReserved
    )
    {
        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 ShowMessageBox(const WCHAR* lpText, const WCHAR* lpCaption)
    {
        MessageBox(NULL, lpText, lpCaption, 0);
        return 0;
    }
    

    (3)创建.def文本文件

    创建.def文本文件
    Text.def文件代码如下:

    LIBRARY DemoDLL
    EXPORTS
        ShowMessageBox

    (4)如果是VS平台,必须要在连接器中添加.def文件
    路径:项目属性 => 链接器 => 输入 => 模块定义文件 => 输入.def文件的文件名

    (5)编译生成dll和lib文件
    编译生成的文件图例

    (6)编写测试程序

    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #include <Windows.h>
    
    using namespace std;
    
    typedef int(*ShowMessageBox)(const WCHAR* lpText, const WCHAR* lpCaption);   //声明函数指针,告诉程序从动态链接库导入的地址是什么类型的函数
    
    int main(void)
    {
        HMODULE hm = LoadLibrary("DemoDLL.dll");            //加载动态链接库
        if (hm == NULL)
        {
            printf("Library Error !
    ");
            system("pause");
            return 0;
        }
        ShowMessageBox SMessageBox = (ShowMessageBox)GetProcAddress(hm, "ShowMessageBox");   //查找函数地址
        if (SMessageBox == NULL)
        {
            cout << GetLastError() << endl;
            printf("GetProcAddress error 
    ");
            system("pause");
            return 0;
        }
        SMessageBox(L"HelloWorld", L"Tip");         //使用dll中导出的函数
        FreeLibrary(hm);
        return 0;
    }
    

    (7)执行成功
    程序运行画面

  • 相关阅读:
    docker 容器
    web开发相关工具总结
    Linux] Git: push 出错的解决 master -> master (branch is currently checked out)
    MongoDB
    vs code 快捷键
    flutter 实现圆角头像的2种方法
    Flutter web环境变量搭建及开发
    使用VS Code调试Flutter(检查用户页面)
    Flutter走过的坑(持续更新)
    react link引入外部css样式的坑
  • 原文地址:https://www.cnblogs.com/csnd/p/12897026.html
Copyright © 2011-2022 走看看