是否可以从注册的COM使用regfree COM?

是否可以从注册的COM使用regfree COM?,com,regfreecom,winsxs,Com,Regfreecom,Winsxs,我一直在尝试实现以下场景: 应用程序[C++]在注册的COM类(CReg/Reg.dll)上使用CoCreateInstance CReg类在regfree/SxS COM类(CFree/Free.dll)上使用CoCreateInstance CoCreateInstance返回REGDB_E_CLASSNOTREG 问题似乎不在于清单,因为若我试图通过应用程序直接实例化CFree,那个么创建对象就并没有问题了 我已经检查过了,上面的场景触发了CReg的激活上下文(我已经用sxstrace检查

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

应用程序[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对象?如果可能的话,是否有一些特殊工作来正确装载

编辑

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

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

我曾尝试在Reg.dll项目上使用启用隔离的预处理器定义,从Reg.dll目录触发激活上下文。Free.dll中的清单已正确加载(sxstrace日志显示),但CoCreateInstance调用仍返回REGDB_E_CLASSNOTREG。指出这一定义是可能的(但没有给出明确的答案)


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

它们都在同一目录中吗?在使用注册COM的场景中,应用程序处于(比方说)C:\Proj\App\目录,在C:\Proj\Libs\中是Free.dll和Reg.dll。如果应用程序直接依赖于Free.dll,则它们位于同一目录中。排除故障的第一步是1)确保两个dll的所有COM都正常注册。2) 确保两个DLL都可以免费注册,3)尝试注册一个DLL,不注册一个DLL。清单在相对路径上工作,其中所有reg free COM内容必须位于进程的目录或子目录中。我会尝试将Reg.dll移动到与其他两个文件相同的目录中,并在那里注册。我发现注册的COM组件(Reg.dll)正在正确加载CFree对象,但只有当Free.dll位于应用程序所在的目录中时(Reg.dll仍在C:\Proj\Libs,)。我不知道该怎么想,因为sxstrace显示Free.dll的清单已正确加载(当它仍在C:\Proj\Libs中时)。我最初的问题现在不知怎么回答了,但这并不能解决我的问题。该Reg.dll组件必须使用Free.dll,并且必须位于同一目录中(这些不能位于应用程序的目录中)。将它链接到Reg.dll或注册Free.dll并不能解决我的问题。我有一种感觉,因为它们不在同一个目录中。免注册COM是一种以目录为中心的东西,安装有时可能被认为只是做一个文件的xcopy——我知道这太简单了。从EXE可以调用CoGetClassObject()。您可以将一个成员添加到接收IClassFactory*接口的CReg对象中,这样您就可以尝试绕过是否在同一目录中的限制。