0

我一直在尝试实现以下场景:

应用程序 [C++] 在注册的 COM 类 (CReg/Reg.dll) 上使用 CoCreateInstance

CReg 类在 regfree/SxS COM 类 (CFree/Free.dll) 上使用 CoCreateInstance。

CoCreateInstance 返回 REGDB_E_CLASSNOTREG。

问题似乎与清单无关,因为如果我尝试通过应用程序直接实例化 CFree,则创建对象没有问题。

我已经检查并且上面的场景触发了 CReg 的激活上下文(我已经检查了 sxstrace),甚至 CFree 的清单也已成功加载(!),这应该在正确的 regfree COM 中起作用。如果我更改 CFree 的清单,那么激活上下文会失败(我相信这证明了它在更改之前被正确触发和加载)。

使用已注册的 COM [CReg] 的场景是否无法访问 CFree 对象?如果可能的话,是否有一些特殊的工作才能正确加载它?

编辑

在 Joe 的帮助下,我们发现问题出在 Free.dll 所在的位置。

主要应用程序(例如)在 C:\Proj\App 中,Reg.dll 和 Free.dll 都在 C:\Proj\Libs 中。是否有可能加载与应用程序位于不同位置的 regfree Free.dll?问题是我不能将它放在应用程序目录或应用程序子目录中(它必须在外部位置)。

我尝试在 Reg.dll 项目上使用 ISOLATION_AWARE_ENABLED 预处理器定义,以从 Reg.dll 目录触发激活上下文。来自 Free.dll 的清单已正确加载(sxstrace 记录),但 CoCreateInstance 调用仍返回 REGDB_E_CLASSNOTREG。这篇博客文章指出,这个定义可能是可能的(但没有就此问题给出明确的答案)。

任何人都可以帮助我解决这个问题,或者至少指向可能给我答案的文档,无论是否有可能,从外部位置加载 regfree dll?

4

0 回答 0