1. VS创建DLL项目工程
#pragma once
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#ifndef PCH_H
#define PCH_H
#include "framework.h"
#endif
#include "pch.h"
#include "pch.h"
#include <iostream>
extern "C" __declspec(dllexport) int add(int a, int b) {
return (a + b);
}
extern "C" __declspec(dllexport) int sub(int a, int b) {
return (a - b);
}
extern "C" __declspec(dllexport) int mul(int a, int b) {
return (a * b);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
){
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
std::cout<<"hello friend---DLL_PROCESS_ATTACH" << std::endl;
break;
case DLL_THREAD_ATTACH:
std::cout << "hello friend---DLL_THREAD_ATTACH" << std::endl;
break;
case DLL_THREAD_DETACH:
std::cout << "welcome back---DLL_THREAD_DETACH" << std::endl;
break;
case DLL_PROCESS_DETACH:
std::cout << "welcome back---DLL_PROCESS_DETACH" << std::endl;
break;
}
return TRUE;
}
2. 右击Dll1项目名,点击生成
3. VS创建控制台程序ConsoleApplication1
#include <iostream>
#include <windows.h>
using namespace std;
#if 0
int main(){
HMODULE hDll = LoadLibrary(L"Dll1.dll");
typedef int (*_pAdd)(int a, int b);
typedef int (*_pSub)(int a, int b);
_pAdd pAdd = (_pAdd)GetProcAddress(hDll, "add");
_pSub pSub = (_pSub)GetProcAddress(hDll, "sub");
cout << pAdd(9, 3) << " " << pSub(9, 3) << endl;
FreeLibrary(hDll);
return 0;
}
#endif
#if 1
#pragma comment(lib,"Dll1.lib")
extern "C" _declspec(dllimport) int add(int a, int b);
extern "C" _declspec(dllimport) int sub(int a, int b);
int main(){
cout << add(9, 3) << " " << sub(9, 3) << endl;
return 0;
}
#endif
4. 到Dll1工程目录下的Debug文件夹中复制Dll1.dll与Dll1.lib文件
5. 到ConsoleApplication1工程目录粘贴Dll1.dll与Dll1.lib文件(lib在隐式调用编译时用,dll在执行时用)
6. 编译链接执行ConsoleApplication1.cpp
hello friend
12 6
welcome back
F:\Desktop\ConsoleApplication1\Debug\ConsoleApplication1.exe (进程 10940)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
7.查看dll文件接口
- 打开VS2019-工具-Visual Studio 命令提示
- 输入dumpbin /exports “C:\Windows\System32\user32.dll”,回车,可查看user32.dll文件的接口
- 其余同理