關於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

相關文章
相關標籤/搜索