[英]How to build with required `.dll` in Windows 10 Visual Studio
我正在嘗試建立一個項目。 我有一個a.lib
文件,需要在我的項目中使用。 我知道使用此庫有兩種方法:
#pragma comment(lib, "a.lib")
添加它 Configuration Properties -> Linker -> Input -> Additional Dependencies
現在, a.lib
使用StackWalk64函數DbgHelp
。 該庫以DbgHelp.lib
和DbgHelp.dll
。 我知道我可以使用上面列出的兩種方法將它用作lib
。 但是,如果我不想將其包含在我的項目中並想使用DbgHelp.dll
,該怎么辦?如何在Visual Studio中做到這一點?
如果要調用DLL中的函數,但又不想鏈接到為您導入這些函數的LIB文件,則可以使用LoadLibrary
和GetProcAddress
。 (盡管如果您具有導入庫並可以鏈接到導入庫,為什么要手動加載這些功能?)
如果您DbgHelp.lib
導入庫,請使用它! 如果不負責任的話,加載功能會出錯。 小心使用!
// Type definition for a function pointer that can call the function
typedef BOOL (WINAPI *StackWalk64_func)
(
DWORD,
HANDLE,
HANDLE,
LPSTACKFRAME64,
PVOID,
PREAD_PROCESS_MEMORY_ROUTINE64,
PFUNCTION_TABLE_ACCESS_ROUTINE64,
PGET_MODULE_BASE_ROUTINE64,
PTRANSLATE_ADDRESS_ROUTINE64
);
// Within a function . . .
HMODULE hDbgHelpDll = LoadLibrary(TEXT("DbgHelp.dll"));
if (hDbgHelpDll == NULL)
{
// handle error and return
}
StackWalk64_func funStackWalk64
= (StackWalk64_func)GetProcAddress(hDbgHelpDll, "StackWalk64");
if (funStackWalk64 == NULL)
{
// handle error and return
}
// funStackWalk64 is valid and ready to use
現在,您可以像函數StackWalk64
一樣調用funStackWalk64
,並將函數指針傳遞到該位置。 使用完庫后,應釋放模塊句柄:
FreeLibrary(hDbgHelpDll);
通常(特別是在Visual C ++中), dll
附帶的lib
文件就是所謂的“導入庫”。 這意味着該庫中沒有實際的功能主體; 它只是在這里安撫鏈接器並指示它生成一個EXE(或DLL),該EXE將在加載時使用第一個dll
。
在這種情況下也是如此。 由於您無權訪問DbgHelp
的源代碼,因此無法將其構建為真正的靜態庫,因此需要在鏈接時使用小型導入庫,並在加載/運行時使用dll文件。
注意:整個鏈接和動態鏈接的概念和機制顯然比我這里討論的要復雜得多。 因此,以上解釋非常狹窄,僅針對您的問題。
請閱讀: http : //www.learncpp.com/cpp-tutorial/a1-static-and-dynamic-libraries/
在這種情況下,靜態庫是一個“導入庫” ,它可以自動確定DLL中的有效功能。 這稱為隱式動態鏈接 。
如果您不想使用導入庫,則必須自己確定所有功能,請創建指向過程地址的相應指針,然后再使用它們。 通常,您的客戶端代碼中有一些InitDLL()函數可以執行此操作。
請參閱: https : //msdn.microsoft.com/de-de/library/64tkc9y5.aspx
“ GetProcAddress”功能可用於獲取該函數的句柄並調用它。
這稱為顯式動態鏈接,並且還要求在Windows上調用LoadLibrary()和FreeLibrary()。
更多信息: http : //www.equestionanswers.com/dll/what-is-implicit-and-explicit-linking-in-dynamic-loading.php
對於linux / unix,工作原理有所不同。 如果您想閱讀: http : //www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.