【发布时间】:2015-05-28 19:20:31
【问题描述】:
目标
为了使将我们的软件部署到生产环境中的技术人员更容易进行故障排除,我希望我们的 Windows 服务记录在运行时它无法加载/定位的所有 DLL服务启动时。没什么特别的,只是:
- DLL 名称
- 成功/失败
这对于 显式 加载的 DLL(例如使用 LoadLibrary())来说很容易。不幸的是,我不知道如何为应用程序启动时自动加载的 DLL 执行此操作(即 隐式 加载的 DLL)。
换句话说,您如何检测在运行时静态加载的 DLL?这甚至可能吗?
您能提供的任何指导将不胜感激!
附加上下文
- 测试机:Windows 8.1 Enterprise (64bit)
参考文献
-
MSDN: Linking an Executable to a DLL
- 隐式和显式链接
- MSDN: Using Run-Time Dynamic Linking
- MSDN: LoadLibrary function
-
MSDN: Dumpbin /Dependents
- 示例:
DumpBin.exe /Dependents c:\Path\To\Application.exe
- 示例:
更新
更新1
为了让部署团队尽可能轻松,我希望在应用程序的事件日志MyWindowsService.log 中写一条明确的消息(毕竟,这是他们查找所有其他消息的地方)...但就 Mark Segal 而言,创建了一个 Windows 事件日志 条目:
Faulting application name: MyWindowsService.exe, version: 2.7.4.1, time stamp: 0x55673caa
Faulting module name: ImplicitlyLoadedLibrary.dll, version: 6.3.9600.17736, time stamp: 0x550f42c2
Exception code: 0xc0000135
Fault offset: 0x0009d4f2
Faulting process id: 0x168c
Faulting application start time: 0x01d0997fc49e50fe
Faulting application path: C:\Program Files (x86)\CompanyName\ApplicationName\MyWindowsService.exe
Faulting module path: ImplicitlyLoadedLibrary.dll
Report Id: 024adcd5-0573-11e5-830a-6c198fb1a83d
Faulting package full name:
Faulting package-relative application ID:
对于任何有兴趣的人Exception code: 0xc0000135 意味着:
找不到依赖的 dll
更新 2
最初的意图是看看:
- 您能否在加载程序开始工作之前检查依赖关系,或
- 您能否进入加载过程以查看正在加载的 DLL 文件
虽然我确实可以实现一个全新的加载机制(即考虑插件架构),但这远远超出了我想要完成的范围。
从目前的答案来看,1. 或 2. 似乎是不可能的。
【问题讨论】:
-
怎么样...检查相关可执行文件的PE?
-
谷歌“windows show loader snaps”。适合技术人员,嗯,使用 SysInternals 的 Process Monitor 可能会更好。
-
体育?我不确定这是什么。你能澄清一下吗?
-
@Mike Holt:您所指的帖子建议使用外部工具。理想情况下,我想在服务启动时执行检查。因此,这不是可能的重复。 stackoverflow.com/q/475148/949681
-
@Pressacco 每个 Windows 可执行文件在磁盘上都有一个便携式可执行文件的形式 - 检查 en.wikipedia.org/wiki/Portable_Executable
标签: c++ dll manifest dynamic-linking