三种方式生成DLL:命令行、VS与显隐式调用详解

三种方式生成DLL:命令行、VS与显隐式调用详解

生成DLL的三种方式

参考链接

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

Windows中使用命令行新建dll

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

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

#include

#include

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!"<

g_hModule = (HINSTANCE)hModule;

break;

// case DLL_PROCESS_DETACH:

case 0:

cout<<"Dll is detached!"<

g_hModule=NULL;

break;

}

return true;

}

保存写好的函数;接下来需要用到命令行来编译这个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路径放进去即可。

使用link命令,将obj文件转成dll文件;

Link /dll dll_demo.obj

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

调用dll;分为显式调用和隐式调用。 **显式调用:**使用LoadLibrary函数调用。

#include

#include

int main(void)

{

//加载dll

HINSTANCE hinst=::LoadLibrary("dll_demo.dll");

if (NULL != hinst)

{

cout<<"dll loaded!"<

}

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

#include

#include "dll_demo.h"

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

{

......

}

调用时,在Main函数中:

#include "dll_withLibAndH.h"

//注意路径,加载 dll的另一种方法是 Project | setting | link 设置里

#pragma comment(lib,"dll_demo.lib")

int main(void)

{

DllMain();//调用dll里的函数

return 0;

}

未完待续。。

相关推荐

问道、改造装备5到6要多少超级石头 问道手游装备改造1-6价目表
beat365官方app安卓版下载

问道、改造装备5到6要多少超级石头 问道手游装备改造1-6价目表

📅 07-02 👁️ 9107
为什么全民枪战不火了?
365bet娱乐场客户端

为什么全民枪战不火了?

📅 07-04 👁️ 5910
王者荣耀主宰首次刷新时间是开局几分钟
beat365官方app安卓版下载

王者荣耀主宰首次刷新时间是开局几分钟

📅 07-03 👁️ 7396
手机管家哪个好用
beat365官方app安卓版下载

手机管家哪个好用

📅 07-02 👁️ 9235
哪些是中唐时期著名的诗人?
速发365网址是多少

哪些是中唐时期著名的诗人?

📅 07-05 👁️ 8552
角球统计数据 - World Cup (国际)
beat365官方app安卓版下载

角球统计数据 - World Cup (国际)

📅 07-03 👁️ 7601