• 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)执行成功
    程序运行画面

  • 相关阅读:
    手把手教你开发Chrome扩展二:为html添加行为
    使用Quartz.NET实现定时发送电子邮件
    手把手教你开发Chrome扩展三:关于本地存储数据
    Android中调用Web Services
    nestedlist的学习
    overlays、picker理解解析
    navigationview的理解
    bBank 更新记录(最后更新:201076)
    开博
    javascript 密码强度规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
  • 原文地址:https://www.cnblogs.com/csnd/p/12897026.html
Copyright © 2020-2023  润新知