一個簡單的DLL生成和測試
DLL文件內容:
SKLDll.h
#ifndef _SKLDLL_H_
#define _SKLDLL_H_
#ifndef DLL_API
#define DLL_API extern "C" __declspec(dllexport)
#else
#define DLL_API extern "C" __declspec(dllimport)
#endif
DLL_API int add(int a,int b);
#endif//_DLLMAIN_DLL_H_
SKLDll.cpp
#include "SKLDll.h"
#include<windows.h>
BOOL APIENTRY DllMain(
HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(NULL,"DLL_PROCESS_ATTACH", "Information", MB_OK | MB_ICONINFORMATION);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_PROCESS_DETACH:
MessageBox(NULL, "DLL_PROCESS_DETACH", "Information", MB_OK | MB_ICONINFORMATION);
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
int add(int a, int b)
{
return (a + b);
}
DLL顯示(動態加載)調用代碼:
#include<windows>
typedef int(*lpAddFun)(int, int);//宏定義函數指針類型 ,定義一個與add函數參數類型和返回類型相同的指針函數
int DllTest(){
HINSTANCE hDll;//dll句柄
lpAddFun addFun;//函數指針
hDll = LoadLibrary("SKLDll.dll");//通過win32的api函數 動態加載dll模塊,並將dll模塊句柄賦給了hdll;
if (hDll != NULL){
addFun = (lpAddFun)GetProcAddress(hDll, "add");//通過api函數將dll模塊中函數add的地址賦給addfun
if (addFun != NULL){
int result = addFun(2, 3);
printf("%d\n", result);
}
FreeLibrary(hDll);
}
else
{
printf("%s", "DLL load failed");
}
return 0;
}
運行結果:
先彈出DLL_PROCESS_ATTACH消息框,然後輸出5,最後彈出DLL_PROCESS_DETACH消息框;
一個簡單的DLL生成和測試