0

我有一个非常复杂的问题,仅适用于非管理员 Windows 用户。

我运行驻留在桌面上的脚本 S 并调用 C++ dll 中的函数。那么流程如下:

  1. 我的 C++ dll 创建了一个 Delphi 进程,将 GUID 作为参数发送给它。
  2. 在初始化时,我的 Delphi 进程使用 COM 对象工厂使用给定的 GUID 注册一个 C 类。
  3. 我的 C++ dll 尝试使用相同的 GUID 调用 CoCreateInstanceEx。==> 操作失败,HResult 0x80029c4a 加载类型库/DLL 时出错。

Delphi 方面没有抛出异常 - 注册似乎工作顺利。

我使用了进程监视器,令我惊讶的是,当调用 CoCreateInstanceEx 时,有人试图从错误的位置读取我的 Delphi exe 文件。与其尝试访问注册 exe 的位置,不如尝试从脚本 S 所在的桌面访问 exe,当然该 exe 不存在。

这只发生在非管理员用户身上。此外,如果管理员用户之前曾运行过此脚本,那么它对于非管理员用户来说运行得非常好。

我现在试图弄清楚为什么会这样。这就是为什么我尝试了解 CoCreateInstanceEx 的流程。我在网上没有找到任何有用的信息。那么 CoCreateInstanceEx 是如何尝试加载类型的呢?它试图在哪里寻找?您知道所描述的情况是如何发生的吗?

任何信息或想法将不胜感激!

4

1 回答 1

0

事实证明,Delphi 进程的 exe 是使用相对路径而不是完整路径注册的。

我仍然不确定为什么对于管理员用户它可以正常工作......所以如果有人有想法我会很想听听。

于 2011-01-10T07:42:24.230 回答