我有一个调用CreateProcess
的流程。看来CreateProcess
返回非零表示成功。但是,然后立即设置该过程的HANDLE,表示该过程已退出。当我致电GetExitCodeProcess
时,会返回STATUS_DLL_NOT_FOUND
。
我知道DLL丢失了。我甚至知道究竟是哪一个。但是,我不明白的是如何以编程方式解决这个问题。
我注意到Windows将显示一个对话框,说明该进程无法启动,因为找不到指定的DLL(屏幕截图:http://www.mediafire.com/view/?kd9ddq0e2dlvlb9)。在对话框中,Windows指定缺少哪个DLL。但是,我发现无法以编程方式自行获取该信息。
如果某个进程无法启动并返回STATUS_DLL_NOT_FOUND
,我该如何以编程方式检索目标进程所链接的库名称,该名称无法找到?这样我就可以在错误报告中自动记录在给定安装中DLL似乎丢失或损坏的内容。
答案 0 :(得分:4)
CreateProcess返回0表示成功。
CreateProcess()
返回BOOL
,其中0为FALSE
,即失败并未成功。
如果进程无法启动并返回STATUS_DLL_NOT_FOUND,如何以编程方式检索目标进程所链接的库名称?
不幸的是,没有API。您唯一的选择是手动访问和枚举可执行文件的IMPORTS
表以找出它使用的DLL,然后递归访问和枚举它们的IMPORTS
表,手动检查您找到的每个DLL引用以查看是否该DLL文件是否存在于OS的搜索路径上。
答案 1 :(得分:2)
如果dll是静态链接的,你可以走iat并查看dll是否存在。如果dll是动态加载的,那么启动进程挂起并挂钩LoadLibrary(或者不是挂钩模拟调试器)是我看到的唯一方法。
答案 2 :(得分:1)
非常困难的方法是:解析.EXE和.DLL文件并创建.DLL文件的依赖关系树。
我认为没有办法获取丢失的DLL文件列表:当Windows找到一个丢失的DLL文件时,它会停止加载,所以如果缺少一个DLL文件,你将无法找到更多的DLL文件不见了。
您可能遇到的另一个问题是旧的DLL版本可能缺少“导出”(函数)。这比依赖树更难检测。
答案 3 :(得分:0)
在其他帖子上找到了答案:https://stackoverflow.com/a/475323/358006
它说要使用 Visual Studio命令提示符(在 Tools 中)和以下命令:
dumpbin /dependents my-app.exe
答案 4 :(得分:0)
由于这在某种程度上是Google上“ STATUS_DLL_NOT_FOUND”的最高堆栈溢出结果。如何跟踪和解决任何随机事件:
下载SysInternals procmon64.exe(或just the entire set)。启动后,立即点击外观上的“停止捕获”按钮(Ctrl + E)。还有“清除”(Ctrl + X)。
设置过滤器:
再次开始捕获(Ctrl + E)。
再次运行有问题的东西(对我来说:build cargo
)。 Google搜索最后列出的DLL文件。
对我来说是VCRUNTIME140.dll,所以我安装了VC++ 2015 to 2019 redistributable。
ProcMon有点像unix strace
。
答案 5 :(得分:-1)
最好的方法是使用加载器快照。基本上,您使用gflags.exe(包含在windbg中)来启用加载程序快照。然后,运行带有调试器的进程。加载程序快照将使加载程序能够打印出该进程的dbg消息,并将打印失败。
gflags.exe -i yourcode.exe +sls
windbg yourcode.exe
我知道这不是找出问题的“编程方式”,但是加载程序的工作很复杂,您真的不想重做其逻辑以查找故障。这就是为什么发明了装载器卡扣的原因。