我们有一个在 Vista 和 Win7 上运行良好的 dll,但是在 XP 上运行时,我们在调用加载它时收到错误“找不到指定的程序”LoadLibrary()。
我已经尝试使用 Profile 选项通过 Dependency Walker 运行它,将全局标志设置为显示加载器快照,我可以从中获得的唯一看似有用的信息是:
LDR: Snapping imports for MyDll.dll from KERNEL32.dll
LDR: LdrGetProcedureAddress by NAME - RtlGetLastWin32Error
LDR: exception c0000139 thrown within function LdrpSnapIAT
Exception record: 0012E490
Context record: 0012E4A4
Context->Eip = 7C9673BE
Context->Ebp = 0012E7C0
Context->Esp = 0012E770
LDR: LdrpSnapIAT - caught exception c0000139 snapping thunks (#2)
LDR: LdrpWalkImportTable - LdrpSnapIAT #2 failed with status c0000139
Run Code Online (Sandbox Code Playgroud)
我相信例外c0000139是“未找到入口点”。
我们已经注意确保对 post-XP API 没有任何直接依赖(有一些,但这些是动态加载的LoadLibrary())。该 dll 是用构建WINVER并_WIN32_WINNT设置为0x0501。库的入口点在 Dependency Monitor 中显示的导出中可见,并且没有明显缺失的依赖项。相同的应用程序在 Vista 和 Win7 中运行得非常好。较早版本的 dll 在 XP 上运行良好(由于该组件的性质,很难看出哪些更改导致了问题)。
编辑:我认为我打折的其他东西:
还有什么明显的我遗漏了吗?
我不知道这是否会帮助你,但我今天在加载器快照上遇到了完全相同的问题。原来我的问题在depends.exe 中可见,但我不知道dll 为粉红色的重要性...我只诊断过依赖的导出问题,而不是导入问题。
我的问题是我使用的是仅在 Vista+ 上可用的“RegGetValue”。不幸的是,如果您在 Windows XP 上使用仅 Vista 的 API,则没有正确的错误报告。Depends 在导入部分显示了这一点,如下所示:

我注意到您的问题出在 Kernel32.dll 而不是 Advapi.dll,因此请使用依赖项检查导入...