生成DLL的三种方式

这篇具有很好参考价值的文章主要介绍了生成DLL的三种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

生成DLL的三种方式

参考链接

1. 用命令行完成dll的新建与调用
2. 在VS中生成dll文件

Windows中使用命令行新建dll

首先需要cl编译器以及link连接器来完成后续操作。

  1. 新建一个dll_demo.cpp文件 ,此文件中的函数是我们想要封装成dll的函数。用写字板创建一个新的文件,文件名可自己选择(这里创建一个dll_demo),文件后缀写为.cpp。
    比如我们想创建一个能实现输出是否进入dll进程的函数。
    则在dll_demo.cpp中的代码为:
#include <objbase.h>
#include <iostream>

BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved)

{
    HANDLE g_hModule;

    switch(dwReason)
    // dwReason 是0/1中的一个结果。如果dwReason为1,则DLL_PROCESS_ATTACH应该为TRUE
    {
    //case DLL_PROCESS_ATTACH:
    case 1:
       cout<<"Dll is attached!"<<endl;
       g_hModule = (HINSTANCE)hModule;
       break;
   // case DLL_PROCESS_DETACH:
   case 0:
       cout<<"Dll is detached!"<<endl;
       g_hModule=NULL;
       break;
    }
    return true;
}
  1. 保存写好的函数;接下来需要用到命令行来编译这个cpp文件,并生成.obj文件。在dll_demo.cpp所在的文件夹下,输入文件路径的地方,输入cmd,可打开命令行界面。
    然后输入:
cl /c dll_demo.cpp

使用cl时,若提示error:“cl’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。”,则可能是没有在环境变量中添加cl的路径。设置方法为:
此电脑-系统属性-高级系统设置-环境变量-系统变量-Path-添加cl.exe所在的文件夹路径。例如:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x64

可在C盘中搜索处,输入cl.exe,将出现的第一个cl.exe路径放进去即可。

  1. 使用link命令,将obj文件转成dll文件;
Link /dll dll_demo.obj

若此时提示error,“LINK : fatal error LNK1104: 无法打开文件“libcpmt.lib”_”,“fatal error LNK1104: 无法打开文件“XXXXX.lib””
在系统变量中新建两个变量INCLUDE,LIB,如下
生成DLL的三种方式生成DLL的三种方式当这些环境配置好后,可以顺利生成dll了。

  1. 调用dll;分为显式调用和隐式调用。
    **显式调用:**使用LoadLibrary函数调用。
#include <windows.h>
#include <iostream>
int main(void)
{
    //加载dll
    HINSTANCE hinst=::LoadLibrary("dll_demo.dll"); 
    if (NULL != hinst)
    {
       cout<<"dll loaded!"<<endl;
    }
    return 0;
}

此时运行结果为:

dll loaded!
dll is attached!
dll is detached!

**隐式调用:**使用__declspec(dllexport)在源代码中定义dll的输出函数。
新建一个头文件dll_demo.h:

__declspec(dllexport) BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved)

在dll_demo.cpp加入:

#include <objbase.h>
#include <iostream>
#include "dll_demo.h"

__declspec(dllexport) BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved)
{
......
}

调用时,在Main函数中:文章来源地址https://www.toymoban.com/news/detail-442409.html

#include "dll_withLibAndH.h"
//注意路径,加载 dll的另一种方法是 Project | setting | link 设置里
#pragma comment(lib,"dll_demo.lib")
int main(void)
{
    DllMain();//调用dll里的函数
    return 0;
}

未完待续。。

到了这里,关于生成DLL的三种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 简单实用!shell脚本实现ssh远程链接的三种方法

    在ubuntu系统中安装SSH客户端: 创建名为connect_remote.sh的shell脚本文件: 请确保将REMOTE_IP和REMOTE_USER变量替换为实际的远程电脑IP地址和用户名。 保存文件后,给与脚本可执行权限: 运行shell脚本,连接远程电脑: 当运行此脚本时,系统会提示输入远程电脑的密码,输入密码后

    2024年02月17日
    浏览(31)
  • Win11系统错误powershell找不到mscoree.dll的三种解决方法

    近期有用户在更新微软Win11最新补丁KB5013943后,出现了严重 Bug,其中包含了powershell.exe - 系统错误,并提示找不到mscoree.dll,这该怎么解决呢?下面小编就为大家带来三种解决方法介绍,一起来看看吧! 更多重装系统教程尽在小白系统重装官网 由于找不到 mscoree.dll ,无法执行

    2024年02月09日
    浏览(25)
  • 系统报错msvcp120.dll丢失的解决方法,常见的三种解决方法

    今天为大家讲述关于系统报错msvcp120.dll丢失的解决方法。在这个信息爆炸的时代,我们每个人都可能遇到各种各样的问题,而这些问题往往需要我们去探索、去解决。今天,我将带领大家走进这个神秘的世界,一起寻找解决msvcp120.dll丢失的方法。   首先,我想问大家一个问题

    2024年02月11日
    浏览(40)
  • Debezium的三种部署方式

    debezium 有下面三种部署方式,其中最常用的就是 kafka connect。 kafka connect 一般情况下,我们通过 kafka connect 来部署 debezium,kafka connect 是一个框架和运行时: source connectors:像 debezium 这样将记录发送到 kafka 的source connector sink connectors:将记录从 kafka topic传播到其他系统的 sin

    2024年02月10日
    浏览(33)
  • redis的三种集群方式

    redis有三种集群方式:主从复制,哨兵模式和集群。     1.主从复制   主从复制原理:   从服务器连接主服务器,发送SYNC命令;  主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;  主服务器BGSAVE执行完后,向所有从服务器

    2024年02月13日
    浏览(35)
  • 线程创建的三种方式

    目录 1. Thread类 2. Runnable接口 3. Callable接口 4. 线程的生命周期 新建  就绪 运行 阻塞 等待 结束 继承Thread类的方式创建线程 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务 创建Thread类的子类,即创建了线程对象 调用线程对象的

    2024年02月09日
    浏览(30)
  • 验证合约的三种方式

    使用truffle插件: https://github.com/rkalis/truffle-plugin-verify truffle run verify 合约名称@合约地址 --network 网络名称 --debug 注意:需要开启VPN,然后给CMD也设置代理,否则CMD无法访问外网会验证失败 (每次新开CMD都要执行) 在etherscan上手动上传 1、合约文件如果有导入的外部合约,需

    2023年04月22日
    浏览(43)
  • 单点登录的三种方式

    因为一个项目种有多个服务组成,每个服务都是独立的,如果登录的时候在一个服务种,那么其他的服务是显示不了的,所以就有了单点登录。 所谓单点登录就是一处登录,处处登录。 第一种方式:session广播机制实现 第一种当时的的原理是session的复制,就是在多个服务中

    2024年02月15日
    浏览(37)
  • 解决NPE的三种方式

    NullPointerException(空指针异常,NPE)是Java编程中常见的错误。解决NPE的方法可以从以下三个方面考虑: 明确处理空引用情况: 在某些情况下,无法避免使用可能为空的引用对象。此时,需要明确处理空引用情况,以避免抛出NPE。可以使用条件判断,例如使用if-else语句或者三

    2024年02月22日
    浏览(43)
  • 集合的三种遍历方式

    目录 文章目录 一.迭代器遍历 二.增强for遍历 三. forEach方法 四. Lambda表达式  函数式接口: 函数式接口是指只有一个抽象方法的接口 为什么Lambda只能用于函数式接口 总结 前言 作者简介:最爱吃兽奶 座右铭:抱怨身处黑暗,不如提灯前行 内容介绍:今天给大家讲一下集合的遍历方

    2024年02月06日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包