VS2012創建,使用並調試DLL

1.如何創建一個DLL項目?

用vs2012創建一個新的Win32 應用控制檯程序,名字取爲math,要勾選dll選項

如圖:

然後新建mymath.h和mymath.cpp文件。
mymath.h如下:

#pragma once
 
#ifdef MATH_EXPORTS
#define MATH_API __declspec(dllexport)
#else
#define MATH_API __declspec(dllimport)
#endif
 
namespace shun
{
	class MATH_API Cmath {				//類
	public:
		int add(int a,int b);
	};
 
	extern "C" MATH_API float pi;			//變量
 
	extern "C" MATH_API int getMax(int &,int &);	//函數
}

mymath.cpp如下:

#include "stdafx.h"
#include "mymath.h"
 
namespace shun
{
	float pi=3.1415;			//變量
 
	int getMax(int& a, int& b) //函數
	{
		return a > b ? a : b;
	}
 
	int Cmath::add(int a,int b)			//類方法
	{
		return a + b;
	}
}

然後生成解決方案,編譯成功後可以在debug文件夾下發現math.dll和math.lib文件。
至此,我們已經成功創建一個dll項目了。

 

2.如何隱式引用一個DLL項目?

隱式調用三要素,.h文件 ,.dll文件,.lib文件,缺一不可。
隱式調用的好處是可以像調用本地函數一樣方便。

2.1如果項目和dll項目在同一個解決方案


爲此我們新建一個win32控制檯的空項目,取名useMath,然後引用dll步驟如下:
項目->屬性->通用屬性->框架和引用->添加新引用->勾選math項目->確定
項目->屬性->配置屬性->VC++目錄->包含目錄->添加mymath.h所在的目錄
然後添加一個test.cpp文件,輸入如下:

#include <iostream>  
#include "mymath.h"
 
using namespace std;  
 
int main(char argc, char**argv)  
{  
	int a = 1, b = 2;
 
	//類的使用
	shun::Cmath cm;
	cout<<cm.add(1,2)<<endl; 
	//變量
	cout<<shun::pi<<endl;
	//函數
	cout<<shun::getMax(a,b);  
	getchar();  
	return 0;  
}

運行一下我們發現調用dll項目了有木有。。

 

2.2如果項目和dll項目不在同一個解決方案呢?


爲此,我們先打開一個新的vs2012,新建一個win32控制檯的空項目,取名useMath,然後引用dll步驟如下:
項目->屬性->配置屬性->VC++ 目錄-> 在“包含目錄”裏添加頭文件mymath.h所在的目錄 
項目->屬性->配置屬性->VC++ 目錄-> 在“庫目錄”裏添加頭文件math.lib所在的目錄 
項目->屬性->配置屬性->鏈接器->輸入-> 在“附加依賴項”裏添加“math.lib”(若有多個 lib 則以空格隔開)
將dll項目下的debug文件中的math.dll複製到當前項目的debug文件夾中
新建然後添加一個test.cpp文件,輸入如下:(和之前一樣)

#include <iostream>  
#include "mymath.h"
 
using namespace std;  
 
int main(char argc, char**argv)  
{  
	int a = 1, b = 2;
 
	//類的使用
	shun::Cmath cm;
	cout<<cm.add(1,2)<<endl; 
	//變量
	cout<<shun::pi<<endl;
	//函數
	cout<<shun::getMax(a,b);  
	getchar();  
	return 0;  
}  

 

3.如何顯示調用dll項目?


顯示調用只需要一個dll文件。顯示調用好處是模塊相對獨立,更新非常方便。不好的地方是使用起來稍微複雜。
同之前一樣,我們新建一個win32控制檯項目,然後將math.dll放入debug文件夾中,
因爲需要使用到windows api,所以要引入windows.h頭文件。

添加test.cpp如下:

#include <windows.h>
#include <iostream>
using namespace std;
 
typedef int (*Func)(int &, int &);
 
int main(int argc, char *argv[])
{
	int a = 5, b = 10;
	HMODULE hDll = LoadLibrary("math.dll");
	if (hDll != NULL)
	{
		Func getMax = (Func)GetProcAddress(hDll, "getMax");	//函數
		if (getMax != NULL)
		{
			cout<<getMax(a, b)<<endl;
		}
		float* pPi = (float*)GetProcAddress(hDll,"pi");		//變量
		if(pPi != NULL)
		{
			cout<<*pPi<<endl;
		}
 
		FreeLibrary(hDll);
	}
	getchar();
}

 

4.VS調試dll詳細過程記錄

 

 前言:

     在我們寫的程序中有時候調用dll,並且需要跟蹤dll中的函數,此時直接調試調用dll的工程是無法跳進dll的函數的,此時我們可以啓動dll工程 來跟蹤程序的走向。注意:要有dll的工程,也就是有其源代碼,因爲我們要在源代碼裏面打斷點。具體步驟如下:

               ------------------------------------------------------------------------------------------------------------------------------------------
                        在這裏有兩個工程:一個是產生dll的工程:FastStrDLL     ------------------用來調試的工程                       
                                                           一個是調用dll的工程:DllReuse         -----------------提供調用dll的exe文件          
               ------------------------------------------------------------------------------------------------------------------------------------------


4.1 將調用dll的工程(DllReuse)目錄下的Debug目錄下產生的exe文件拷貝到產生dll的工程(FastStrDLL)的Debug目錄下:

 4.2 打開產生dll的工程(FastStrDLL)-->右鍵工程-->屬性-->調試,然後按如下配置:

4.3 在dll工程源代碼中設置斷點按F5開始調試成功:(斷點位置只要程序能走到就行)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章