Windows 之Dll/lib导出
DLL导出del方式部分:
右键新建dll项目,然后右键工程属性选择-实用工具-文本文件---->修改为Text.def
接着在def文件中输入下面的导出接口声明,以及dll名字
Def方式生成dll
Text.def
LIBRARY ExportDllDemo
EXPORTS
ShowMessageBox @1
dllmain.cpp
void ShowMessageBox()
{
//MessageBox(NULL, L"fuck work", L"tips", 0); 最好不要在dll了面使用msgbox会有问题
std::cout<<"hello hello i am exaple dll"<<std::endl;
}
//以上准备好导出dll的数据
新建一个控制台程序,loadingDllDemo.cpp
typedef void(*ShowMessageBox)();
int main()
{
HMODULE hm = LoadLibrary(L"ExportDllDemo.dll");
if (hm == NULL)
{
printf("Library Error !\n");
return 0;
}
ShowMessageBox SMessageBox = (ShowMessageBox)GetProcAddress(hm, "ShowMessageBox");
DWORD res = GetLastError();
if(SMessageBox)
SMessageBox();
system("pause");
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
非Def方式生成Dll
声明dll为导出接口:
用法: extern "C" void __declspec(dllexport) ShowMessageBox();
dllmain里定义 void ShowMessageBox();
新建一个控制台程序,loadingDllDemo.cpp
typedef void(*ShowMessageBox)();
int main()
{
std::cout << "Hello World!\n";
HMODULE hm = LoadLibrary(L"ExportDllDemoEx.dll");
if (hm == NULL)
{
printf("Library Error !\n");
return 0;
}
ShowMessageBox SMessageBox = (ShowMessageBox)GetProcAddress(hm, "ShowMessageBox");
DWORD res = GetLastError();
if (SMessageBox)
SMessageBox();
system("pause");
}
如果需要对dll加密处理,使用非对称加密方式,dll预留一个init接口,用来校验获取初始化的句柄,每次使用dll的接口都需要把初始化的句柄带上校验。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
VS新建-桌面程序-静态库:
pch.h
声明方法
#ifndef PCH_H
#define PCH_H
void ShowMessageBox();
#endif //PCH_H
pch.cpp
定义方法
#include "pch.h"
#include <windows.h>
void fnExportLibDemo()
{
MessageBox(NULL, L"fuck lib", L"tips", 0);
}
void ShowMessageBox()
{
MessageBox(NULL, L"hello lib", L"tips", 0);
}
环境配置
1、添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录。
2、添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录。
然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。
loadplugindemo.cpp
#pragma comment(lib,"ExportLibDemo.lib")
int main()
{
ShowMessageBox();
system("pause");
}
使用lib或者dll优势、区别,加密如下: