关于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