c++ - 您如何检测在运行时静态加载的 DLL?

标签 c++ dll manifest dynamic-linking

目标

为了让将我们的软件部署到生产环境中的技术人员更容易进行故障排除,我希望我们的 Windows 服务记录它无法在运行时加载/定位的所有 DLL服务启动时。没什么特别的,只是:

  • 动态链接库的名称
  • 成功/失败

对于显式加载的 DLL(例如使用 LoadLibrary())来说,这很容易。不幸的是,我不知道如何为应用程序启动时自动加载的 DLL(即隐式加载的 DLL)执行此操作。

换句话说,您如何检测在运行时静态加载的 DLL?这可能吗?

如果您能提供任何指导,我们将不胜感激!

附加上下文

  • 测试机:Windows 8.1 企业版(64 位)

引用资料

更新

更新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

初衷是想看看是否:

  1. 你能在加载器开始工作之前检查依赖关系吗,或者
  2. 你能 Hook 加载过程以查看正在加载哪些 DLL

虽然我确实可以实现一个全新的加载机制(即考虑插件架构),但这远远超出了我想要完成的范围。

从目前的答案来看,1.2. 似乎不太可能。

最佳答案

一种可能性是使您当前的服务逻辑成为一个单独的 DLL s,从驱动程序 d 加载。然后在d中,在加载s之前,动态加载s所依赖的DLL。在过去,您可以通过 Resource Kit 中的 depends 工具 Dependency Walker 找到该集合(我认为是);现在它显然是通过 its own web page 分发的.


请注意,当一个 DLL 被加载时,无论加载机制如何,它都会被加载。因此,当 d 随后加载 s 时,它的所有 DLL 依赖项都会得到满足。包括静态的。

关于c++ - 您如何检测在运行时静态加载的 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30515356/

相关文章:

c++ - constexpr if 和 static_assert

c++ - 如何释放被返回的变量占用的内存(使用 C++,在类中,析构函数)?

c++ - 从 Excel VBA 使用 C++ dll 时出现 "Bad DLL calling convention"- 如何解决?

jquery - 缓存页面 AJAX 不起作用

c++ - 我在 C++ 中使用此 lambda 函数的示例有什么问题 - 编译错误?

c++ - Node.js Addon 无法转换参数

c# - 从系统服务调用的 VS 调试 DLL

windows - 我如何知道系统调用属于哪个 DLL?

google-chrome - 简单地替换渐进式 Web 应用程序的图标会导致 list 中出现错误

java - Android 如何使我的应用程序在分辨率小于 480x800 的设备上不可见