第19講——動態連接庫

1,創建一個win32的dll項目,編譯。在vs的安裝目錄下的E:\visual stdio 2015\VC\bin執行vcvars32.bat,使得dumpbin.exe可用。使用dumpbin -exports ConsoleApplication1.dll能夠查看動態連接庫的導出函數。若是要導出函數,則在動態連接庫的函數名前要加_declspec(dllexport),如_declspec(dllexport) int add(int a, int b)函數

2,在要調用動態連接庫的工程裏 先聲明 extern int add(int a, int b);而後再使用,而且在工程中要加入動態連接庫生成的ConsoleApplication1.dll 和ConsoleApplication1.lib。 _declspec(dllexport)標識符聲明的函數效率更高,相對於用externspa

3,能夠用dependency walker查看動態連接庫中導出的函數字符串

4,若是動態連接庫項目中源程序本身要使用動態連接庫函數,則在動態連接庫頭文件中使用預編譯宏編譯器

#ifdef DLL1_API
#else
#define DLL1_API _declspec(dllexport)
#endif // DLL1_APIstring

動態連接庫源文件中使用io

#define DLL1_API _declspec(dllexport)
#include "dll1.h"編譯

5,本身搜MSDN時找到的一種在各類字符串類型之間進行轉換的方法  https://msdn.microsoft.com/zh-cn/library/ms235631(v=VS.100).aspx效率

如char 和wchar_t之間的轉換程序

char *orig = "Hello, World!";
size_t newsize = strlen(orig) + 1;
wchar_t * wcstring = new wchar_t[newsize];
size_t convertedChars = 0;
mbstowcs_s(&convertedChars, wcstring, newsize, orig, _TRUNCATE);

6,在MFC中能夠調用GetForegroundWindow(),返回指向前臺窗口(使用用戶當前)的窗口。方法

7,爲了防止在不一樣的編譯器中以及C++編寫的動態連接庫能被用c寫的程序調用,則在導出函數前要加extern 「C」 如#define DLL1_API extern "C" _declspec(dllexport)

8,若是導出函數的調用約定使用了標準調用約定_stdcall 能夠經過模塊定義文件的方式來解決名字改編的問題。模塊定義文件的後綴名是.def,模塊定義文件能夠按以下所示寫:

LIBRARY DLL2

EXPORTS
add
subtract

9,對動態連接庫的使用能夠有隱式鏈接(經過頭文件和加入連接庫.lib),和動態加載(LoadLibrary函數,GetProcAddress函數獲取導出函數的地址)。如:

HINSTANCE hinst;
hinst = LoadLibrary(_T("DLL2.dll"));
typedef int(*addProc)(int a, int b);
addProc pdd = (addProc)GetProcAddress(hinst, "add");

10,MAKEINTRESOURCE()宏,能夠將動態連接庫序號轉化爲字符串

11, DLLMain動態連接庫入口函數

12,在不須要動態連接庫的時候,能夠用FreeLibrary();

相關文章
相關標籤/搜索