当前位置:   article > 正文

生成DLL的三种方式_如何生成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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  1. 保存写好的函数;接下来需要用到命令行来编译这个cpp文件,并生成.obj文件。在dll_demo.cpp所在的文件夹下,输入文件路径的地方,输入cmd,可打开命令行界面。
    然后输入:
cl /c dll_demo.cpp
  • 1

使用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
  • 1

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

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

若此时提示error,“LINK : fatal error LNK1104: 无法打开文件“libcpmt.lib”_”,“fatal error LNK1104: 无法打开文件“XXXXX.lib””
在系统变量中新建两个变量INCLUDE,LIB,如下
系统环境变量-INCLUDE系统环境变量-LIB当这些环境配置好后,可以顺利生成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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

此时运行结果为:

dll loaded!
dll is attached!
dll is detached!
  • 1
  • 2
  • 3

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

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

在dll_demo.cpp加入:

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

__declspec(dllexport) BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved)
{
......
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

调用时,在Main函数中:

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

未完待续。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/204314
推荐阅读
相关标签
  

闽ICP备14008679号