繁体   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