简单的Dll
#include "stdafx.h"
//导出函数
extern "C" __declspec(dllexport) VOID MsgBox(char *szMsg);
VOID MsgBox(char *szMsg)
{
char szModuleName[MAX_PATH] = {0};
//获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载
GetModuleFileName(NULL,szModuleName,MAX_PATH);
MessageBox(NULL,szMsg,szModuleName,MB_OK);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call) //DllMain被调用的原因
{
case DLL_PROCESS_ATTACH: //当DLL被某进程加载时被调用
MsgBox("DLL_PROCESS_ATTACH");
break;
case DLL_PROCESS_DETACH: //当DLL被某进程卸载时调用
MsgBox("DLL_PROCESS_DETACH");
break;
case DLL_THREAD_ATTACH: //进程中有线程被创建时调用
MsgBox("DLL_THREAD_ATTACH");
break;
case DLL_THREAD_DETACH: //进程中有线程结束时被调用
MsgBox("DLL_THREAD_DETACH");
break;
}
return TRUE;
}
静态测试:
#include "stdafx.h"
#include "windows.h"
extern "C" VOID MsgBox(char *szMsg);
#pragma comment(lib, "FirstDll")
int main(int argc, char* argv[])
{
MsgBox("Hello First Dll!");
return 0;
}
动态测试:
#include "stdafx.h"
#include "windows.h"
typedef VOID (*PFUNMSG)(char *);
int main(int argc, char* argv[])
{
HMODULE hModule = LoadLibrary("FirstDll.dll"); //动态加载dll文件
if(hModule == NULL)
{
MessageBox(NULL, "Dll.dll 文件不存在", "DLL加载失败", MB_OK);
return -1;
}
PFUNMSG pFunMsg = (PFUNMSG)GetProcAddress(hModule, "MsgBox"); //检索指定的动态链接库(DLL)中的输出库函数地址
pFunMsg("Hello First Dll");
return 0;
}
如果程序出错,可能是函数名被修饰了,解决:
将生成的Dll文件拖入该软件,点击如图按钮:
便可以看到正确的函数名