本文將創建一個簡單的動態鏈接庫,並編寫一個控制台應用程序使用該動態鏈接庫,該動態鏈接庫為“JAVA調用動態鏈接庫DLL之JNative學習”中使用的DLL,只是項目及文件名稱不同。
創建動態鏈接庫項目:
2、在新建項目窗口中選擇其他語言->Visual C++->Win32。
3、選擇Win32 項目,設置名稱:simpleDLL,設置解決方案名:simpleDLL。
4、單擊確定,在出現的Win32 應用程序向導的概述對話框中點擊下一步。
5、在應用程序設置中,選擇應用程序類型下的DLL。
6、勾選附加選項下的空項目。
7、單擊完成創建項目。
向動態鏈接庫添加類:
1、添加新類頭文件。右鍵單擊simpleDLL項目,添加->新建項,選擇頭文件(.h),設置名稱為simpleDLL,單擊添加。
2、添加新類源文件。右鍵單擊simpleDLL項目,添加->新建項,選擇C++ 文件(.cpp),設置名稱為simpleDLL,單擊添加。
3、為新類添加內容。內容如下:
頭文件simpleDLL.h:<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD48cD48L3A+PHByZSBjbGFzcz0="brush:java;">//------------------ SimpleDLL.h ---------------- #pragma once; //該宏完成在dll項目內部使用__declspec(dllexport)導出 //在dll項目外部使用時,用__declspec(dllimport)導入 //宏DLL_IMPLEMENT在SimpleDLL.cpp中定義 #ifdef DLL_IMPLEMENT #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif DLL_API int add(int x, int y); //簡單方法 DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId); DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);源文件simpleDLL.cpp:
//------------------ SimpleDLL.cpp ---------------- //注意此處的宏定義需要寫在#include "SimpleDLL.h"之前 //以完成在dll項目內部使用__declspec(dllexport)導出 //在dll項目外部使用時,用__declspec(dllimport)導入 #define DLL_IMPLEMENT #include "SimpleDLL.h" #include#include #include #include int DLL_API add(int x, int y) { return x+y; } DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId) { static wchar_t url[260] = { 0 }; wcscpy_s(url, L"http://中文"); wcscat_s(url, mgrIp); wcscat_s(url, L":"); wchar_t szPort[20] = { 0 }; _ltow_s(mgrPort, szPort, 10); wcscat_s(url, szPort); return url; } DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId) { static char url[260] = { 0 }; strcpy_s(url, "http://中文"); strcat_s(url, mgrIp); strcat_s(url, ":"); char szPort[20] = { 0 }; _ltoa_s(mgrPort, szPort, 10); strcat_s(url, szPort); return url; }
創建引用動態鏈接庫的應用程序:
1、在解決方案上單擊鼠標右鍵->添加->新建項目。
2、在添加新項目中選擇其它語言->Visual C++->Win32。
3、選擇Win32 控制台應用程序,設置名稱:simpleDLLTest。
4、單擊確定,在出現的Win32 應用程序向導的概述對話框中點擊下一步。
5、在應用程序設置中,選擇應用程序類型下的控制台應用程序。
6、單擊完成創建項目。
在控制台應用程序中使用類庫的功能:
1、為SimpleDLLTest.cpp添加內容。如下所示:
// SimpleDLLTest.cpp : 定義控制台應用程序的入口點。 #include "stdafx.h" #include "../SimpleDLL/SimpleDLL.h" //添加頭文件引用 #pragma comment(lib, "..\\..\\SimpleDLL\\Release\\SimpleDLL.lib") //添加lib文件引用 #include2、引用simpleDLL項目。右鍵單擊SimpleDLLTest項目,選擇項目依賴項。#include int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL, "chs"); //配置地域化信息為簡體中文,否則打印出來的中文是亂碼 wprintf(L"getPlayUrl: %s\r\n", getPlayUrl(L"127.0.0.1", 10087, 1)); printf("getUrl: %s\r\n", getUrl("127.0.0.1", 10087, 1)); system("pause"); return 0; }
3、依賴於窗口中勾選SimpleDLL,單擊確定。
4、設置SimpleDLLTest項目為活動項目。右鍵單擊SimpleDLLTest項目,選擇設為啟動項目。
6、生成解決方案。Debug運行結果如下:
注意:現在創建的DLL只能由c++調用,C語言等其它語言是調用不了的!
我們來用工具看一下,在解決方案上單擊鼠標右鍵,在Windows資源管理器中打開文件夾
我編譯的是Release版本,所以打開Release文件夾,找到SimpleDLL.dll文件,用Depends工具打開它
目前編譯的版本對MSVCR100.DLL還有依賴,這樣復制到其它沒有安裝VS2010的電腦上是用不了的;
在項目上單擊鼠標右鍵,屬性:
在左側的配置屬性中選擇常規,在右側找到MFC的使用,選擇在靜態庫中使用MFC
這裡是修改MFC的使用,還有另一種方法:vs2010發布時去除msvcp100.dll和msvcr100.dll圖解說明
再看函數,帶有一些特殊字符,這樣c++之外其它語言是調用不了的;我們需要在頭文件的函數聲明中添加extern "C"標志,代碼如下:
//------------------ SimpleDLL.h ---------------- #pragma once; //該宏完成在dll項目內部使用__declspec(dllexport)導出 //在dll項目外部使用時,用__declspec(dllimport)導入 //宏DLL_IMPLEMENT在SimpleDLL.cpp中定義 #ifdef DLL_IMPLEMENT #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif extern "C" DLL_API int add(int x, int y); //簡單方法 extern "C" DLL_API const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId); extern "C" DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);重新編譯,再用Depends工具打開它,可以發現依賴項已經沒有了,函數名稱也正常了:
參考:演練:創建和使用動態鏈接庫 (C++)