准备环境:
VS2015
系统:
Win10
1、首先用VS2015创建一个DLL
2、在DLLmain.cpp代码如下:
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include <windows.h>
extern"C" // 以C语言的方式导出一个函数
_declspec(dllexport) // 用于声明一个函数会被导出
int fun() //随便创建一个函数
{
return MessageBox(0, L"HelloWorld", 0, 0);
}
// 模块句柄 , 模块加载基址
BOOL APIENTRY DllMain(HMODULE hModule, // DLL被加载到的内存地址
DWORD ul_reason_for_call, //DllMain被调用的原因
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: // 进程创建时被调用
MessageBox(0, L"进程创建时被调用", L"DllMain", 0);
break;
case DLL_THREAD_ATTACH: // 线程创建时被调用
MessageBox(0, L"线程创建时被调用", L"DllMain", 0);
break;
case DLL_THREAD_DETACH: // 线程退出时被调用
MessageBox(0, L"线程退出时被调用", L"DllMain", 0);
break;
case DLL_PROCESS_DETACH: // 进程退出时被调用
MessageBox(0, L"进程退出时被调用", L"DllMain", 0);
break;
}
return TRUE;
}
2、1:分别看看C语言跟C++导出方式
第一种是C语言的
第二种是C++的名称粉碎机制
3、创建一个控制台程序调用DLL
// RunDll.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
typedef int(*fnFun)(); // 定义函数指针类型
int main()
{
// 1. 显式链接
//1.1 加载DLL
// hDll : DLL的加载基址
HMODULE hDll = LoadLibrary(L"test.dll");
fnFun pfnFun = nullptr; // 函数指针类型的变量
// 1.2 获取DLL中的函数的地址
pfnFun = (fnFun)GetProcAddress(hDll, "fun");
// 1.3 调用函数
pfnFun();
//1.4 释放DLL
FreeLibrary(hDll);
return 0;
}
4、如何调试自己写的DLL
右键属性->调试->命令