在VS2012中采用C++中調用DLL中的函數(4)
轉自: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“ 創建結束
下面開始 講述如何向動態鏈接庫中添加類:
- 在菜單欄上:FILE-->NEW-->File,這是會彈出一個對New File話框
- 在左側窗格中選擇Visual C++後,右側窗格內容會發生變化,在右側窗格中選擇”Header File(.h)“然後選擇”Open“
- 出現Header1.h文件,,然後選擇常用菜單欄”Save“按鈕,將其保存為”AddDLL.h“
- 添加下面代碼至”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“錯誤.
步驟如下:
-
為了創建一個項目引用你剛剛創建好的DLL,在菜單欄中選擇" 文件>新建>項目"
-
在左窗格中的“Visual C++”下,選擇“Win32”。
-
在中間窗格中,選擇“Win32 控制臺應用程序”。
-
在“名稱”框中為項目指定名稱,例如,testDLL。 從“解決方案”旁邊的下拉列表中選擇“添加到解決方案”。 這會將新項目添加到包含 AddDLL.DLL 的同一個解決方案中。 選擇“確定”按鈕。
-
在“Win32 應用程序向導”對話框的“概述”頁上,選擇“下一步”按鈕。
-
在“應用程序設置”頁上的“應用程序類型”下,選擇“控制臺應用程序”。
-
在“應用程序設置”頁上的“附加選項”下,清除“預編譯頭”復選框。
-
選擇“完成”按鈕創建項目。
在應用程序中使用類庫的功能
-
在創建一個控制臺應用程序後,一個空的程序已經為你創建好了。 源文件的名稱與之前選擇的名稱相同,名為“tesDLL.cpp”。
-
若要使用您 DLL 中創建的算術例程,必須引用 DLL。 在"Solution Explorer "(解決方案資源管理器)中選擇 testDLL 項目,然後在菜單欄上,選擇Project-->Reference。 在“testDLL Propeities Pages屬性頁”對話框中,展開“Commen Propeities通用屬性”節點,選擇“Framework and Reference 框架和引用”,然後選擇“Add New Reference添加新引用”按鈕。 有關“引用”對話框的更多信息,請參見“<Projectname> 屬性頁”對話框 ->“通用屬性”->“框架和引用”。
-
“添加引用”對話框列出了可以引用的庫。 “項目”選項卡列出了當前解決方案中的所有項目,以及它們包含的所有庫。 在“項目”選項卡上,選中“AddDLL”旁邊的復選框,然後選中“確定”按鈕。
-
若要引用 DLL 的頭文件,必須修改包含的目錄路徑。 為此,請在“Propeities Pages屬性頁”對話框中展開“配置屬性”節點,然後展開“C/C++”節點,並選擇“General常規”。 在“Addentional Include Directories附加包含目錄”旁邊,指定AddDLL.h 頭文件所在位置的路徑。 可以使用相對路徑(例如 ..\AddDLL\),然後選擇“確定”按鈕。
-
現在即可在此應用程序中使用MathFuncs 類。 使用以下代碼替換“testDll.cpp”的內容:
6.通過在菜單欄上一依次選擇“Build --Build testDLL”
下面運行testDLL,需要有一個 比較細微的設置:
-
確保選擇“testDLl”作為默認項目。 在“解決方案資源管理器”中,選擇testDLL,然後在菜單欄上依次選擇“項目”、“設為啟動項目”。
-
若要運行項目,請在菜單欄上依次選擇“調試”、“開始執行(不調試)”。 控制臺輸出結果 7.
在VS2012中采用C++中調用DLL中的函數(4)