關於windows dll的生成
今天上午看到VC板上有人提到dll調用約定的問題,發現本身一直以來只是網上說的文章去作的,具體的實驗還真的沒有作過。中午閒來無聊,寫了幾個小例子,測試一下windows dll的生成規律。
windows下面的dll生成取決於如下幾條因素
1. 根據DEF文件生成仍是__declspec(dllexport)關鍵字指定
2. C編譯仍是C++編譯
3. 調用約定是_cdecl仍是_stdcall
測試環境 vc6.0綠色版
新建工程 testdll(win32 dynamic lib)用來生成dll
新建工程 testmydll(win32 console app),顯示調用dll
生成dll文件testdll.cpp
測試dll文件testmydll.cpp
採用depends觀察dll的輸出函數名
1 使用_declspec(dllexport)關鍵字,C編譯,_cdecl
導出函數名 fnTestdll _cdecl調用成功, __stdcall調用失敗
2 使用_declspec(dllexport)關鍵字,C編譯,_stdcall
導出函數名 _fnTestdll@4 _cdecl調用失敗, __stdcall調用失敗
3 使用_declspec(dllexport)關鍵字,C++編譯,_cdecl
導出函數名 ?fnTestdll@@YAHH@Z _cdecl調用失敗, __stdcall調用失敗
4.使用_declspec(dllexport)關鍵字,C++編譯,_stdcall
導出函數名 ?fnTestdll@@YGHH@Z _cdecl調用失敗, __stdcall調用失敗
5.使用DEF文件 , C編譯, _cdecl
導出函數名 fnTestdll, _cdecl調用成功, __stdcall調用失敗
6.使用DEF文件, C編譯, _stdcall
導出函數名 fnTestdll, _cdecl調用失敗, __stdcall調用成功
7.使用DEF文件 , C++編譯, _cdecl
導出函數名 fnTestdll, _cdecl調用成功, __stdcall調用失敗
8.使用DEF文件, C++編譯, _stdcall
導出函數名 fnTestdll, _cdecl調用失敗, __stdcall調用成功
結論: 儘量仍是用DEF文件定義輸出函數吧:)
特別是須要給非C++程序調用(使用__stdcall)的時候.;
附測試代碼:
testdll.cpp
#include \"stdafx.h\"
BOOL APIENTRY DllMain( HANDLE 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 __cdecl fnTestdll(int i)
{
return i;
}
}
testdll.def
LIBRARY \"testdll.dll\"
DESCRIPTION \"testdll\"
EXPORTS
Function names @nums
testmydll.cpp
#include \"stdafx.h\"
#include <windows.h>
int main(int argc, char* argv[])
{
typedef int( *MyProc)(int);
HINSTANCE hinstDLL=::LoadLibrary(\"D:\\\\Src\\\\Test\\\\testdll\\\\Debug\\\\testdll.dll\");
if(hinstDLL!=NULL){
MyProc pProc = (MyProc)::GetProcAddress(hinstDLL,\"fnTestdll\");
if(pProc){
int i = pProc(24);
printf(\"%d\\n\",i);
}
FreeLibrary(hinstDLL);
}
return 0;
}windows