我有一个非常复杂的问题,仅适用于非管理员 Windows 用户。
我运行驻留在桌面上的脚本 S 并调用 C++ dll 中的函数。那么流程如下:
- 我的 C++ dll 创建了一个 Delphi 进程,将 GUID 作为参数发送给它。
- 在初始化时,我的 Delphi 进程使用 COM 对象工厂使用给定的 GUID 注册一个 C 类。
- 我的 C++ dll 尝试使用相同的 GUID 调用 CoCreateInstanceEx。==> 操作失败,HResult 0x80029c4a 加载类型库/DLL 时出错。
Delphi 方面没有抛出异常 - 注册似乎工作顺利。
我使用了进程监视器,令我惊讶的是,当调用 CoCreateInstanceEx 时,有人试图从错误的位置读取我的 Delphi exe 文件。与其尝试访问注册 exe 的位置,不如尝试从脚本 S 所在的桌面访问 exe,当然该 exe 不存在。
这只发生在非管理员用户身上。此外,如果管理员用户之前曾运行过此脚本,那么它对于非管理员用户来说运行得非常好。
我现在试图弄清楚为什么会这样。这就是为什么我尝试了解 CoCreateInstanceEx 的流程。我在网上没有找到任何有用的信息。那么 CoCreateInstanceEx 是如何尝试加载类型的呢?它试图在哪里寻找?您知道所描述的情况是如何发生的吗?
任何信息或想法将不胜感激!