关于windows dll的生成

关于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 dll的生成)