CreateProcess STATUS_DLL_NOT_FOUND - 哪个dll?

Kei*_*h4G 9 c c++ windows dll winapi

我有一个调用的过程CreateProcess.似乎CreateProcess返回非零表示成功.但是,然后立即设置该过程的HANDLE,表示该过程已退出.当我打电话时GetExitCodeProcess,STATUS_DLL_NOT_FOUND然后返回.

我知道DLL丢失了.我甚至知道究竟是哪一个.但是,我不明白的是如何以编程方式解决这个问题.

我注意到Windows将显示一个对话框,说明该进程无法启动,因为它无法找到指定的DLL(屏幕截图:http://www.mediafire.com/view/?kd9ddq0e2dlvlb9).在对话框中,Windows指定缺少哪个DLL.但是,我发现无法以编程方式自行获取该信息.

如果进程无法启动并将返回STATUS_DLL_NOT_FOUND,我如何以编程方式检索目标进程所链接的库名称,该名称无法找到?这样我就可以在错误报告中自动记录在给定安装中DLL似乎丢失或损坏的内容.

Rem*_*eau 5

CreateProcess返回0表示成功。

CreateProcess()返回a BOOL,其中0是FALSE,也就是失败不成功。

如果某个进程无法启动并返回STATUS_DLL_NOT_FOUND,我如何以编程方式检索找不到目标进程所链接到的库名?

不幸的是,没有用于此的API。唯一的选择是手动访问并枚举可执行文件的IMPORTS表以查明其使用的DLL,然后递归访问并枚举其IMPORTS表,手动检查找到的每个DLL参考,以查看该DLL文件是否存在于操作系统的搜索路径中或不。


Mar*_*nau 1

非常困难的方法是:解析.EXE和.DLL文件并创建.DLL文件的依赖关系树。

我认为没有一种方法可以获取丢失的 DLL 文件列表:当 Windows 发现一个丢失的 DLL 文件时,它会停止加载,因此如果丢失一个 DLL 文件,您将无法发现是否丢失了更多 DLL 文件。

您可能遇到的另一个问题是旧的 DLL 版本可能缺少“导出”(函数)。这比依赖树更难检测。

  • @MooingDuck:这是正确的;但是,当在运行时调用 DLL 时,CreateProcess() 已经成功返回。 (2认同)