1. 程式人生 > >在VS2012中采用C++中調用DLL中的函數(4)

在VS2012中采用C++中調用DLL中的函數(4)

color style 屬性 cls weight 項目 新建工程 ifdef xxx

轉自:http://www.cnblogs.com/woshitianma/p/3683495.html

這兩天因為需要用到VS2012來生成一個DLL代碼,但是之前並沒有用過DLL相關的內容,從昨天開始嘗試調試DLL的文件調用,起初筆者在網絡上找到了3片采用VSXXX版本進行調試的例子,相關的內容見本人Blog在C++中調用DLL中的函數(1)(2)(3)

但是問題出現了,上面講述的步驟很詳細但是在自己運行的時候卻會出現錯誤,於是今天在使用google“vs2012 c++調用dll”時,發現了一篇MSDN上的指南:http://msdn.microsoft.com/zh-cn/library/ms235636.aspx

在這篇指南和之前3篇文章的綜合指引下,筆者完成了在VS2012中編寫DLL並成功調用DLL的例程,下面將這個過程一步一步詳細描述出來:

1、首先,打開VS2012 ,在菜單欄中依次選擇:FILE-->NEW-->Project;

2、在 “新建項目”對話框左邊窗格中,展開“Installed”-->Templates-->VisualC++ -->Win32”從右側窗格中選擇“Win32 Console Application”(有blog說到Win32Project也可以,筆者未嘗試)。

3、在下方窗格“Name”中填寫AddDLL(工程名稱),“Location”中選擇工程的生成目錄,Solution中 為“Create new solution”,“Solution name”中填寫建立的解決方案的名稱“AddDLL” 。確認OK

筆者在此選擇工程名稱和解決方案名稱相同,這樣有時會造成誤導,所以建議新建工程時註意區分名稱。

4、“win32 application wizard 中“(Win32 應用程序向導)對話框的“概述”頁上,選擇“next 下一步”按鈕。

5、因為需要在這個工程中生成DLL文件,所以需要在右側窗格中勾選 ”Dll選項“,在”Additional Options“中可以選擇

”Precompiled header“和”Security Development Lifecycle(SDL)“選項這樣在生成的”AddDLL.cpp“文本中就會出現”#include "stdafx.h"“字樣

6、選擇”Finish“ 創建結束

下面開始 講述如何向動態鏈接庫中添加類:

  1. 在菜單欄上:FILE-->NEW-->File,這是會彈出一個對New File話框
  2. 在左側窗格中選擇Visual C++後,右側窗格內容會發生變化,在右側窗格中選擇”Header File(.h)“然後選擇”Open“
  3. 出現Header1.h文件,,然後選擇常用菜單欄”Save“按鈕,將其保存為”AddDLL.h“
  4. 添加下面代碼至”AddDLL.h“文件

技術分享圖片 // AddDLL.h #ifdef ADDDLL_EXPORTS #define ADDDLL_API __declspec(dllexport) #else #define ADDDLL_API __declspec(dllimport) #endif 技術分享圖片

註:當定義了 MATHFUNCSDLL_EXPORTS 符號時,MATHFUNCSDLL_API 符號將在此代碼中的成員函數聲明中設置 __declspec(dllexport) 修飾符。 此修飾符使函數能作為 DLL 導出,以供其他應用程序調用。 當 MATHFUNCSDLL_EXPORTS 未定義時,MATHFUNCSDLL_API 會在成員函數聲明中定義 __declspec(dllimport) 修飾符。 此修飾符能夠使編譯器優化從 DLL 導入的用於其他應用程序的函數。 默認情況下,生成 MathFuncsDll 項目時會定義 MATHFUNCSDLL_EXPORTS。 有關詳細信息,請參閱 dllexport、dllimport。

5.在”AddDLL.h“文本中繼續填寫如下代碼,建立名為”MatFuncs“一個基礎類,這個基礎類中只寫了一個算術運算:兩個整數相加

namespace MathFuncs

技術分享圖片 { class AddDLL { public: //returns a+b static ADDDLL_EXPORTS_API int Add(int a,int b);
}; //註意:MathFuncclass聲明這裏;不可少 }
技術分享圖片

然後在“解決方案資源管理器”的“AddDLL”項目中,在“源文件”文件夾中,打開”AddDLL.cpp“文本,在源文件中實現 MathFuncs 的功能。 代碼應類似如下:

#include "stdafx.h"

技術分享圖片 #include "AddDLL.h"
using namespace std; namespace MathFuncs { int MathFuncs::Add(int a,int b) { return a+b; } }
技術分享圖片

6.在菜單欄中“BUILD -->BUILD Solution (F7)或者Bulid AddDLL“生成解決方案,編譯動態鏈接庫,至此DLL已經生成,生成位置在上面幾篇文章中有詳細講述,就是在工程目錄下的Debug文件夾中

=======================================================================

下面開始創建引用 DLL 的應用程序

引用DLL的程序的工程,可以同編譯動態鏈接庫的工程建立在同一個Solution下,也可以不建立在同一個Solution下,不在同一個solution下的方法見文章在C++中調用DLL中的函數(3)

下面講的是建立在同一個Solution:AddDLL下,在同一個解決方案下時,需要有一個設置,如果不設置,就會導致”Unable to find XXX.DLL“錯誤.

步驟如下:

  1. 為了創建一個項目引用你剛剛創建好的DLL,在菜單欄中選擇" 文件>新建>項目"

  2. 在左窗格中的“Visual C++”下,選擇“Win32”。

  3. 在中間窗格中,選擇“Win32 控制臺應用程序”。

  4. 在“名稱”框中為項目指定名稱,例如,testDLL。 從“解決方案”旁邊的下拉列表中選擇“添加到解決方案”。 這會將新項目添加到包含 AddDLL.DLL 的同一個解決方案中。 選擇“確定”按鈕。

  5. “Win32 應用程序向導”對話框的“概述”頁上,選擇“下一步”按鈕。

  6. 在“應用程序設置”頁上的“應用程序類型”下,選擇“控制臺應用程序”。

  7. 在“應用程序設置”頁上的“附加選項”下,清除“預編譯頭”復選框。

  8. 選擇“完成”按鈕創建項目。

在應用程序中使用類庫的功能

  1. 在創建一個控制臺應用程序後,一個空的程序已經為你創建好了。 源文件的名稱與之前選擇的名稱相同,名為“tesDLL.cpp”。

  2. 若要使用您 DLL 中創建的算術例程,必須引用 DLL。 在"Solution Explorer "(解決方案資源管理器)中選擇 testDLL 項目,然後在菜單欄上,選擇Project-->Reference。 在“testDLL Propeities Pages屬性頁”對話框中,展開“Commen Propeities通用屬性”節點,選擇“Framework and Reference 框架和引用”,然後選擇“Add New Reference添加新引用”按鈕。 有關“引用”對話框的更多信息,請參見“<Projectname> 屬性頁”對話框 ->“通用屬性”->“框架和引用”。

  3. “添加引用”對話框列出了可以引用的庫。 “項目”選項卡列出了當前解決方案中的所有項目,以及它們包含的所有庫。 在“項目”選項卡上,選中“AddDLL”旁邊的復選框,然後選中“確定”按鈕。

  4. 若要引用 DLL 的頭文件,必須修改包含的目錄路徑。 為此,請在“Propeities Pages屬性頁”對話框中展開“配置屬性”節點,然後展開“C/C++”節點,並選擇“General常規”。 在“Addentional Include Directories附加包含目錄”旁邊,指定AddDLL.h 頭文件所在位置的路徑。 可以使用相對路徑(例如 ..\AddDLL\),然後選擇“確定”按鈕。

  5. 現在即可在此應用程序中使用MathFuncs 類。 使用以下代碼替換“testDll.cpp”的內容:

技術分享圖片 #include "stdafx.h" #include "AddDLL.h" //在這裏需要將本工程的testDLL.h添加到工程中,否則include下會出現紅色波浪線 #include <iostream> //這裏的include <iostream>需要同using name space std配合使用 using namespace std; int main() { int a = 3; int b = 4; cout<< MathFuncs::AddDLL::Add(a,b)<<endl; getchar();//讓consol能夠保持住窗口 } 技術分享圖片

6.通過在菜單欄上一依次選擇“Build --Build testDLL”

下面運行testDLL,需要有一個 比較細微的設置:

  1. 確保選擇“testDLl”作為默認項目。 在“解決方案資源管理器”中,選擇testDLL,然後在菜單欄上依次選擇“項目”、“設為啟動項目”。

  2. 若要運行項目,請在菜單欄上依次選擇“調試”、“開始執行(不調試)”。 控制臺輸出結果 7.

在VS2012中采用C++中調用DLL中的函數(4)