2011年4月27日 星期三

[C++ 文章收集] Step by step 從 dll 呼叫 C++ 類別 (VC++)


轉載自 這理
前言 :
這裡將示範如何建立 C++ 類別的 dll, 並從別的 Project 來使用該 dll 建立對應的 C++ 類別. 這裡我們使用 VS 2008 當作開發 IDE.

建立包含 C++ 類別 的 dll :
底下我們將利用 VS 2008 來建立一個產出 DLL 的專案.
Step1 :
打開 VS2008 後, File > New > 專案. 並於出現視窗選擇 C++ > 類別庫


接著產出專案檔案如下 :


Step 2 :
修改 Test.h, Test.cpp 如下 :
- Test.h :
  1. // Test.h  
  2. #pragma once  
  3.   
  4. #ifdef TEST_EXPORTS  
  5. #define TEST_API __declspec(dllexport)  
  6. #else  
  7. #define TEST_API __declspec(dllimport)  
  8. #endif  
  9.   
  10. class TEST_API Test  
  11. {  
  12. public:  
  13.     Test();  
  14.     ~Test();  
  15.     void hello();  
  16. };  

- Test.cpp :
  1. #include "stdafx.h"  
  2. #include   
  3. #include   
  4. #include "Test.h"  
  5.   
  6. Test::Test()  
  7. {  
  8.     // Constructor  
  9. }  
  10.   
  11. Test::~Test()  
  12. {  
  13.     //De-Constructor  
  14. }  
  15.   
  16. void Test::hello()  
  17. {  
  18.     printf("Hello John^^\n");  
  19. }  

底下是原作說明. 簡單說就是如果你要類別 Symbols 能夠輸出到 dll, 則需要 define TEST_EXPORTS 並在 class 後加上 TEST_API . 然後提供 Test.h 給使用這個 dll 的專案去 include. 但是我們並沒有在 Test.h 上 define TEST_EXPORTS. 而是在編譯參數上指定...
What is going on here? What does #ifdef TEST_EXPORTS mean, and where is TEST_EXPORTS defined?
What is happening is that, depending on whether TEST_EXPORTS is defined, TEST_API will be defined to export or import the DLL symbols. The export process results in the DLL's symbols being defined in Test.lib, which can be linked to any VC++ application that wants to access the DLL. When compiling Test.dll, I want to export, which means I want TEST_EXPORTS to be defined.

Step 3 :
接個我們要在 Compile 參數上動手腳, 首先在專案上點右鍵並選取屬性. 在出現視窗如下添加編譯選項 :


Step4 :
最後一步就是在專案上點右鍵並選取 "建置" 或 "重建" 導出 dll 與 lib 檔.

在別的專案使用含 C++ 類別的 dll :
接著我們要在其他專案使用剛剛產出的 Test.dll/Test.lib. 首先我們先 Initialize 一個專案再將 Test.h include 進來 :
Step1 :
開啟新專案 File > New > 專案, 並於出現視窗做如下設定 :


Step2 :
在專案當前目錄下建立 include 目錄與 lib 目錄存放 Test.h 與 Test.lib, Test.dll :


Step3 :
將 Test.h 加入當目前專案, 在專案點擊右鍵 > Add > 現有項目...


將 .\include\ 加入編譯時 include 的路徑中, 在專案點擊右鍵並選取 "屬性". 於如下出現視窗作對應設定 :


Step4 :
連結時加入 Test.lib. 在專案點取右鍵並選擇屬性, 並於出現視窗進行設定 :
4-1 : 設定 lib 路徑.

4-2 : 設定相依 library (Test.lib)


Step5 :
接著我們要來寫代碼了, 請添加 main.cpp 並編寫如下 :
- main.cpp :
  1. #include "Test.h"  
  2. #include   
  3. #include   
  4.   
  5. int main()  
  6. {  
  7.     Test test;  
  8.     test.hello();  
  9.     system("pause");  
  10. }  

Step6 :
編譯要用到 lib 檔, 但是執行要用到 dll 檔, 所以接著我們來編寫 建置後事件, 請在專案點擊右鍵並選取屬性, 於出現視窗作如下設定 :


Step6 :
最後一個步驟就是編譯與執行 :
6-1 : 點擊專案右鍵並選擇 "建置" 或 "重建" 進行編譯.
6-2 : 按下快鍵 F5 執行程式並出現
This message was edited 14 times. Last update was at 27/04/2011 17:17:56

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...