VC++ | DLL的创建和使用

DLL的创建和使用

动态链接库概述

在这里插入图片描述

1.新建项目

在这里插入图片描述

1-1.新建文件

新建DLL1.cpp

#include "pch.h"

int add(int a, int b)
{
	return (a+b);
}

int subtract(int a, int b)
{
	return (a-b);
}

1-2.生成动态链接库

在这里插入图片描述

在这里插入图片描述

2.Dumpbin命令

该命令位于:D:\03_tools\DesTools\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64目录下,添加到PATH环境变量中;

2-1.用法

PS D:\05_study\mark-down-doc\11-tools\VS2017\Dll1\ch20\Debug> dumpbin.exe
Microsoft (R) COFF/PE Dumper Version 14.16.27049.0
Copyright (C) Microsoft Corporation.  All rights reserved.

用法: DUMPBIN [选项] [文件]

  选项:

   /ALL
   /ARCHIVEMEMBERS
   /CLRHEADER
   /DEPENDENTS
   /DIRECTIVES
   /DISASM[:{BYTES|NOBYTES}]
   /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
   /EXPORTS
   /FPO
   /HEADERS
   /IMPORTS[:文件名]
      /LINENUMBERS
   /LINKERMEMBER[:{1|2}]
   /LOADCONFIG
   /NOLOGO
      /OUT:filename
   /PDATA
   /PDBPATH[:VERBOSE]
   /RANGE:vaMin[,vaMax]
   /RAWDATA[:{NONE|1|2|4|8}[,#]]
   /RELOCATIONS
   /SECTION:名称
   /SUMMARY
   /SYMBOLS
   /TLS
   /UNWINDINFO

Windows PowerShell
版权所有(C) Microsoft Corporation。保留所有权利。

安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows

PS D:\05_study\mark-down-doc\11-tools\VS2017\Dll1\ch20\Debug> dumpbin.exe -exports .\Dll1.dll
Microsoft (R) COFF/PE Dumper Version 14.16.27049.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file .\Dll1.dll

File Type: DLL

  Summary

        1000 .00cfg
        1000 .data
        1000 .idata
        1000 .msvcjmc
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        5000 .text
       10000 .textbss

上面输出没有任何与函数有关的信息,Dll1.dll因此没有导出任何函数;

3.从DLL中导出函数

代码修改如下,在函数前面添加标识符“_declspec(dllexport)”;

#include "pch.h"

_declspec(dllexport) int add(int a, int b)
{
	return (a+b);
}

_declspec(dllexport) int subtract(int a, int b)
{
	return (a-b);
}

重新生成DLL文件。

在这里插入图片描述

PS D:\05_study\mark-down-doc\11-tools\VS2017\Dll1\ch20\Debug> dumpbin.exe -exports .\Dll1.dll
Microsoft (R) COFF/PE Dumper Version 14.16.27049.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file .\Dll1.dll

File Type: DLL

  Section contains the following exports for Dll1.dll

    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 00011136 ?add@@YAHHH@Z = @ILT+305(?add@@YAHHH@Z)
          2    1 000111E5 ?subtract@@YAHHH@Z = @ILT+480(?subtract@@YAHHH@Z)

  Summary

        1000 .00cfg
        1000 .data
        1000 .idata
        1000 .msvcjmc
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        5000 .text
       10000 .textbss

4.参考

1.VC++深入详解(第3版)(基于Visual Studio 2017) 孙鑫@编著
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最简单的dll并不比c的helloworld难,只要一个DllMain函数即可,包含objbase.h头文件(支持COM技术的一个头文件)。若你觉得这个头文件名字难记,那么用windows.H也可以。源代码如下:dll_nolib.cpp #include #include BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved) { HANDLE g_hModule; switch(dwReason) { case DLL_PROCESS_ATTACH: cout<<"Dll is attached!"<<endl; g_hModule = (HINSTANCE)hModule; break; case DLL_PROCESS_DETACH: cout<<"Dll is detached!"<<endl; g_hModule=NULL; break; } return true; } 其中DllMain是每个dll的入口函数,如同c的main函数一样。DllMain带有三个参数,hModule表示本dll的实例句柄(听不懂就不理它,写过windows程序的自然懂),dwReason表示dll当前所处的状态,例如DLL_PROCESS_ATTACH表示dll刚刚被加载到一个进程中,DLL_PROCESS_DETACH表示dll刚刚从一个进程中卸载。当然还有表示加载到线程中和从线程中卸载的状态,这里省略。最后一个参数是一个保留参数(目前和dll的一些状态相关,但是很少使用)。 从上面的程序可以看出,当dll被加载到一个进程中时,dll打印"Dll is attached!"语句;当dll从进程中卸载时,打印"Dll is detached!"语句。 编译dll需要以下两条命令: cl /c dll_nolib.cpp 这条命令会将cpp编译为obj文件,若不使用/c参数则cl还会试图继续将obj链接为exe,但是这里是一个dll,没有main函数,因此会报错。不要紧,继续使用链接命令。 Link /dll dll_nolib.obj 这条命令会生成dll_nolib.dll。 注意,因为编译命令比较简单,所以本文不讨论nmake,有兴趣的可以使用nmake,或者写个bat批处理来编译链接dll。 加载DLL(显式调用)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值