1. 程式人生 > >VS2008 C++呼叫DLL 動態呼叫

VS2008 C++呼叫DLL 動態呼叫

為了共享程式碼,需要生成標準的dll,本文將介紹在vs2008 C++生成及呼叫dll。

一、生成DLL

    生成一個名為FunDll的dll檔案,對外函式為addl。

   step1:vs2008 環境下,檔案-->新建專案,選擇visual c++,在選擇 “Win32 專案”,鍵入專案名稱,如 FunDll。如圖:

   

點選下一步,勾選“DLL”和“匯出空符號”,單擊“完成”

  

step 2,編寫功能函式

   執行完step1步驟後,在FunDll.h 和FunDll.cpp中會生成一些例項程式碼,先把這些註釋掉,同時修改FunDll.h中的預處理巨集定義為:

#ifdef FUNDLL_EXPORTS
#define FUNDLL_API extern "C" __declspec(dllexport)
#else
#define FUNDLL_API extern "C" __declspec(dllexport)
#endif

在FunDll.h中宣告add函式,在FunDll.cpp中實現該函式。修改完後代碼如下:

FunDll.h:

  1. // 下列 ifdef 塊是建立使從 DLL 匯出更簡單的
  2. // 巨集的標準方法。此 DLL 中的所有檔案都是用命令列上定義的 FUNDLL_EXPORTS
  3. // 符號編譯的。在使用此 DLL 的
  4. // 任何其他專案上不應定義此符號。這樣,原始檔中包含此檔案的任何其他專案都會將
  5. // FUNDLL_API 函式視為是從 DLL 匯入的,而此 DLL 則將用此巨集定義的
  6. // 符號視為是被匯出的。
  7. #ifdef FUNDLL_EXPORTS
  8. #define FUNDLL_API extern "C" __declspec(dllexport)
  9. #else
  10. #define FUNDLL_API extern "C" __declspec(dllexport)
  11. #endif
  12. FUNDLL_API int _stdcall add(int plus1,int plus2);  

FunDll.cpp

  1. #include "stdafx.h"
  2. #include "FunDll.h"
  3. int _stdcall add(int plus1,int plus2)  
  4. {  
  5.     int ret ;  
  6.     ret=plus1+plus2;  
  7.     return ret;  
  8. }  

step3:新增 FunDll.def,修改內容為

  1. LIBRARY "FunDll"
  2. EXPORTS  
  3.     add  


step 4,釋出FunDll.dll檔案

二,呼叫FunDll.dll

step1,新建C++控制檯程式,專案名稱為TestDll。

修改TestDll.cpp的程式碼為:

  1. // TestDll.cpp : 定義控制檯應用程式的入口點。
  2. //
  3. #include "stdafx.h"
  4. #include <windows.h>
  5. #include <stdio.h>
  6. #include <iostream>
  7. //定義MYPROC為指向一個返回值為int型的函式的指標
  8. typedefint (__stdcall *MYPROC)(int a,int b);  
  9. int _tmain(int argc, _TCHAR* argv[])  
  10. {     
  11.     HINSTANCE hinstLib;  
  12.     MYPROC ProcAdd;  
  13.     int val1,val2,res;  
  14.     val1=4;  
  15.     val2=5;  
  16.     // Get a handle to the DLL module.
  17.     hinstLib = LoadLibrary(L"FunDll.dll");   
  18.     // If the handle is valid, try to get the function address.
  19.     if (hinstLib != NULL)   
  20.     {   
  21.         ProcAdd = (MYPROC) GetProcAddress(hinstLib, "add");   
  22.         res=(ProcAdd)(val1,val2);  
  23.         printf("%d\n",res);  
  24.     }  
  25.         return 0;  
  26. }  


step2,把FunDll拷貝至TestDll專案資料夾下。

step3,執行,測試通過。