簡體   English   中英

如何在Windows 10 Visual Studio中使用必需的.dll進行構建

[英]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.libDbgHelp.dll 我知道我可以使用上面列出的兩種方法將它用作lib 但是,如果我不想將其包含在我的項目中並想使用DbgHelp.dll ,該怎么辦?如何在Visual Studio中做到這一點?

如果要調用DLL中的函數,但又不想鏈接到為您導入這些函數的LIB文件,則可以使用LoadLibraryGetProcAddress (盡管如果您具有導入庫並可以鏈接到導入庫,為什么要手動加載這些功能?)

如果您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/

與導入庫的隱式鏈接(使用.lib)

在這種情況下,靜態庫是一個“導入庫” ,它可以自動確定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上的顯式鏈接

對於linux / unix,工作原理有所不同。 如果您想閱讀: http : //www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM