簡介
在之前已經筆者已經寫過利用.def文件進行dll函數動態(tài)導出的文章弥激,那么今天就給大家介紹一下心包,如何利用__declspec函數前綴進行簡單的靜態(tài)函數導出未辆。
要點
大家閱讀過動態(tài)導出的文章后,只需要將原文導出函數的前綴加上extern"C" __declspec(dllexport)前綴住闯,然后刪除原項目中的.def文件即可断箫。
附上DLL源碼與測試源碼
- dll源碼
// dllmain.cpp : 定義 DLL 應用程序的入口點拂酣。
#include "stdafx.h"
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern"C" __declspec(dllexport) int ShowMessageBox(const WCHAR* lpText, const WCHAR* lpCaption)
{
MessageBox(NULL, lpText, lpCaption, 0);
return 0;
}
- 測試源碼
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <Windows.h>
using namespace std;
typedef int(*ShowMessageBox)(const WCHAR* lpText, const WCHAR* lpCaption); //聲明函數指針,告訴程序從動態(tài)鏈接庫導入的地址是什么類型的函數
int main(void)
{
HMODULE hm = LoadLibrary("DemoDLL.dll"); //加載動態(tài)鏈接庫
if (hm == NULL)
{
printf("Library Error !\n");
system("pause");
return 0;
}
ShowMessageBox SMessageBox = (ShowMessageBox)GetProcAddress(hm, "ShowMessageBox"); //查找函數地址
if (SMessageBox == NULL)
{
cout << GetLastError() << endl;
printf("GetProcAddress error \n");
system("pause");
return 0;
}
SMessageBox(L"HelloWorld", L"Tip"); //使用dll中導出的函數
FreeLibrary(hm);
return 0;
}