赞
踩
1. 用命令行完成dll的新建与调用
2. 在VS中生成dll文件
首先需要cl编译器以及link连接器来完成后续操作。
#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; }
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 /dll dll_demo.obj
若此时提示error,“LINK : fatal error LNK1104: 无法打开文件“libcpmt.lib”_”,“fatal error LNK1104: 无法打开文件“XXXXX.lib””
在系统变量中新建两个变量INCLUDE,LIB,如下
当这些环境配置好后,可以顺利生成dll了。
#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函数中:
#include "dll_withLibAndH.h"
//注意路径,加载 dll的另一种方法是 Project | setting | link 设置里
#pragma comment(lib,"dll_demo.lib")
int main(void)
{
DllMain();//调用dll里的函数
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。