我正在尝试建立一个项目。我有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中执行此操作呢?
答案 0 :(得分:3)
如果要调用DLL中的函数,但不想链接到为您导入这些函数的LIB文件,则可以使用LoadLibrary
和{{1} }。 (虽然如果您有导入库并且可以链接到它,为什么要手动加载这些函数?)
如果您有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
一样调用funStackWalk64
,并在该位置周围传递函数指针。当您使用该库时,您应该释放模块句柄:
StackWalk64
答案 1 :(得分:2)
通常(特别是在Visual C ++中)lib
附带的dll
文件就是所谓的“导入库”。这意味着库中没有实际的函数体;只是在那里安抚链接器并指示它生成一个EXE(或DLL),它将在加载时使用第一个dll
。
在这种情况下也是如此。由于您无法访问DbgHelp
的源代码,因此您可以将其构建为真正的静态库,您需要在链接时使用小型导入库,在加载/运行时使用dll文件。时间。
注意:整个链接和动态链接的概念和机制显然要比我在这里讨论的空间复杂得多。所以,上面的解释非常狭窄,特定于你的问题。
答案 2 :(得分:2)
请阅读: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