1

我的项目是一个插件(Windows DLL),它由不受我控制的主机可执行文件加载。我的 DLL 想要加载一些额外的库。我用私人集会来做这件事;Win32 App 插件如何在其自己的目录中加载其 DLL 以了解如何执行此操作有一个很好的答案。但是,如果我/delayload dependentlib.dll在主 DLL 的链接行上添加以避免加载程序集,直到需要它(由于各种原因我必须这样做),Windows 不再搜索我的私有程序集——似乎它忽略了我编译的清单。相反它在通常的搜索路径中查找延迟加载的 DLL。(我使用 sysinternals procmon 来检查这个。)

这是一个已知的错误,还是有其他方法可以延迟加载程序集?我宁愿不走 LoadLibrary + GetProcAddress 路线,我必须知道我在依赖库中关心的所有符号。

4

2 回答 2

1

您的问题是,当第一次调用延迟加载函数时,应用程序默认激活上下文是当前上下文。

您需要做的是创建一个激活上下文:CreateActCtx指向您自己的清单(我认为可能是hinstance+resource id)。

然后,使用ActivateActCtx (以及相应的 deactivate 函数)包装所有或至少是第一个对 dll 的调用,以确保搜索到正确的程序集。

In theory you could just embed the code to activate the appropriate context in the delayload helper function.

于 2011-02-16T15:15:46.353 回答
0

不幸的是,这种行为是设计使然。本质上,当您指定 /DELAYLOAD 时,您只是指示链接器为您插入 LoadLibrary 和 GetProcAddress 调用。因此,延迟加载 DLL 时的行为与使用 LoadLibrary 动态加载该 DLL 时的行为相同。

MSDN描述了一些后果。从好的方面来说,您可以覆盖默认行为。我建议编写自己的延迟加载辅助函数。

FARPROC WINAPI __delayLoadHelper2(PCImgDelayDescr pidd, FARPROC * ppfnIATEntry)
{
    //...
}

每当需要解析延迟加载的 DLL 中的入口点时,链接器将插入对此函数的调用。您的版本可以为您的私有程序集实现自定义搜索。 这是有关 MSDN 上的辅助函数的附加信息。

于 2011-02-16T13:56:22.603 回答