首页 > 其他分享 >Dll 可执行文件的编写与调用

Dll 可执行文件的编写与调用

时间:2024-09-02 18:48:11浏览次数:9  
标签:可执行文件 调用 NULL 函数 导出 DLL Dll

一、Dll 可执行文件的编写

首先我们需要在 VS 创建一个动态链接库(DLL)项目,然后会生成如下代码:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,  // 指向 Dll 模块的句柄
                       DWORD  ul_reason_for_call,  // 指示调用 DllMain 的原因
                       LPVOID lpReserved  // 保留参数,忽略
                     )
{
    switch (ul_reason_for_call)
    {
        // 进程加载本 Dll 后执行
        case DLL_PROCESS_ATTACH:
            MessageBoxA(NULL, "Dll 加载成功", NULL, NULL);
            break;

        // 线程被创建后执行
        case DLL_THREAD_ATTACH:
            break;

        // 线程正常退出后执行
        case DLL_THREAD_DETACH:
            break;

        // 进程卸载本 Dll 后执行
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

直接编译即可生成一个最简单的 Dll 可执行文件,那么如果我们想要在 Dll 文件中导出相关函数,那么要怎么操作呢?

我们需要定义一个导出函数声明,并且对这个导出函数进行实现:

extern "C" __declspec(dllexport) void MsgBox(LPCSTR msg, LPCSTR title)
{
    MessageBoxA(NULL, msg, title, NULL);
}

上面的代码中,我们声明并实现了一个 MsgBox 函数,函数中调用了 MessageBoxA 函数。其中,__declspec(dllexport) 修饰符表示该函数用于导出,extern "C" 表示在对该函数进行编译的时候按照 C 语言编译方式进行。

其实除了导出函数外,我们还可以通过 __declspec(dllimport) 修饰符来告诉编译器,被它修饰的函数或变量需要从其他的 Dll 导入,由于 Dll 可执行文件很少用到导入功能,在此不做详述。

二、动态调用 Dll 可执行文件的导出函数

首先,我们需要定义一个函数指针用来接收这个导出函数:

// 定义一个函数指针
typedef void(*PMSGBOX)(LPCSTR msg, LPCSTR title);

然后我们通过 LoadLibrary 函数来动态加载 Dll 可执行文件,并通过 GetProcAddress 函数来从 Dll 可执行文件中获取特定的导出函数:

// 加载 Dll 模块
HMODULE hModule = LoadLibraryA("./console_Dll.dll");
if (hModule)
{
    PMSGBOX pMsgBox = (PMSGBOX)GetProcAddress(hModule, "MsgBox");
    pMsgBox("hello", "msgbox");
}

调用的结果如下:

标签:可执行文件,调用,NULL,函数,导出,DLL,Dll
From: https://www.cnblogs.com/lostin9772/p/18393266

相关文章

  • kimi:如何分析是哪个接口调用了最多次的operator new[]接口?
    如何分析是哪个接口调用了最多次的operatornew[]接口?重载operatornew[]:你可以在你的程序中重载operatornew[],记录每次调用时的调用栈信息。#include<iostream>#include<fstream>#include<new>#include<cstdlib>#include<execinfo.h>//包含backtrace函数#inc......
  • 《鸣潮》游戏崩溃弹窗“错误代码[126]:加载xapofx1_5.dll失败”该怎么解决?鸣潮游戏闪
    在《鸣潮》游戏中,若出现崩溃弹窗“错误代码[126]:加载xapofx1_5.dll失败”,可尝试重新安装游戏运行所需的组件。检查系统环境是否完整,确保相关动态链接库文件正确安装,以解决此问题,顺利进行游戏。本篇将为大家带来《鸣潮》游戏崩溃弹窗“错误代码[126]:加载xapofx1_5.dll失败”该......
  • “由于找不到 acui23.dll 无法执行代码”专家级修复教程:详尽步骤助您重启应用程序
    当您尝试运行AutoCAD或其他依赖acui23.dll文件的应用程序时,可能会遇到“由于找不到acui23.dll无法执行代码”的错误提示。这通常意味着系统中缺少必要的动态链接库文件或存在兼容性问题。本文将详细解释这个问题的原因,并提供多种解决方法,帮助您顺利运行应用程序。acui2......
  • C#调用第三方软件及交互
    最近有一个功能pdf转epub,网上找到一个解决方案pdf2epubEX,Windows环境只能以docker方式安装,手动执行docker命令是可以的,如下图:由于pdf数量过多,全部手动转肯定不行,想通过C#调用docker命令,但是这种方法会报错"theinputdeviceisnotaTTY.Ifyouareusingmintty,tryprefix......
  • WinRM远程管理受阻?wsclient.dll缺失的诊断与修复全流程
    wsclient.dll是一个与Windows系统相关的动态链接库(DLL)文件,通常与Windows远程管理(WinRM)服务有关。WinRM服务允许远程访问和管理Windows系统,wsclient.dll可能包含了处理远程请求、资源管理和与其他系统组件交互等功能所需的函数和资源,对于确保远程管理功能的正常运行非常重要。......
  • hp1006pp.dll:HP打印机驱动的核心,受损后的修复指南
    hp1006pp.dll是一个与HP打印机相关的动态链接库(DLL)文件,通常与HPLaserJet1006等型号的打印机驱动程序的功能实现有关。这个DLL文件可能包含了处理打印作业、资源管理和与其他系统组件交互等功能所需的函数和资源,对于确保打印机驱动程序的正常运行非常重要。当hp1006pp.dll......
  • IDA反编译dll库时导入C++头文件
    引言有时候,可能因为硬盘损坏等等原因,自己曾经写的动态链接库源码丢失了,幸好对应的头文件得以保留了下来,这个动态链接库主要是某种算法的实现,并没有继承其他的一些类库,比如MFC之类的,而自己对算法的实现已经忘得差不多了,而突然又需要该算法的实现过程,那么有什么办法可以帮助......
  • 【Ansible】ansible调用主机报错问题
    ansible预计实现功能,自动生成/etc/hosts文件,copy到远程机器,出现如下错误:配置如下:----hosts:192.168.31.12remote_user:clustersudo:yestasks:-name:dirstributehostfiletemplate:src=templates/hosts.j2dest=/......
  • 18. 构造函数和析构函数,构造函数的分类和调用
    构造函数和析构函数构造函数//没有返回值不用写void//函数名与类名相同//可以有参数,可以发生重载//构造函数由编译器自动调用一次无须手动调用析构函数//没有返回值不用写void函数名与类名相同函数名前加~不可以有参数,不可以发生重载析构函数也是由编......
  • VIN车辆信息查询|阿里云实现调用API接口
    整体请求流程:介绍:本次解析通过阿里云云市场的云服务来实现通过17位车架号来识别到车型的详细信息,比如年份、款式、排放标准等,首先需要准备选择一家可以提供查询的商品。https://market.aliyun.com/apimarket/detail/cmapi00065864#sku=yuncode5986400001步骤1:选择商品如图可申请......