我想知道为什么链接器不能简单地通过查询获得实际实现代码的实际.dll文件中的信息来完成它们的工作?我的意思是为什么链接器仍然需要.lib文件来进行隐式链接?
不是导出和相对地址表足以进行此类链接吗?
无论如何,只使用.dll而没有.lib存根/代理文件的人可以进行隐式链接吗?
我认为windows可执行加载器只是代表程序执行LoadLibrary / LoadLibraryEx调用(因此名称隐式链接),这是显式链接的主要区别。如果这是真的,那么在没有.lib的情况下明确地执行它应该表明它是可行的,如果没有隐式,对吧?或者我只是说无意义?
感谢任何帮助,非常感谢:)
geeko
答案 0 :(得分:7)
我可以想到几个原因。
我不知道有任何方法只使用DLL隐式链接 - 快速搜索显示了几个工具,但我没有使用过任何工具。
在这种情况下,我将创建一个单独的源文件,其中包含您需要使用的函数,并动态加载DLL并根据需要绑定它们。例如:
// using global variables and no-error handling for brevity.
HINSTANCE theDll = NULL;
typedef void (__stdcall * FooPtr)();
FooPtr pfnFoo = NULL;
INIT_ONCE initOnce;
BOOL CALLBACK BindDLL(PINIT_ONCE initOnce, PVOID parameter, PVOID context)
{
theDll = LoadLibrary();
pfnfoo = GetProcAddress(dll, "Foo");
return TRUE;
}
// Export for foo
void Foo()
{
// Use one-time init for thread-safe lazy initialization
InitOnceExecuteOnce(initOnce, BinDll, NULL, NULL)
pfnFoo();
}