gpt4 book ai didi

c++ - 在同一个 DLL 中使用 _COM_SMARTPTR CreateInstance 而无需注册

转载 作者:可可西里 更新时间:2023-11-01 11:47:17 24 4
gpt4 key购买 nike

我目前正在尝试编写一个 DLL,它使用在系统中注册的 Typelib (.tlb)。此 Typelib 要求我使用自己的类实现两个接口(interface),并在运行对象表中注册其中一个,这是我在使用 Visual Studio 2015 的 ATL 项目中完成的。

使用我的 DLL 的应用程序应该完全不了解 COM,一切都应该在幕后工作并隐藏在我正在实现的 DLL 中。

在我的 DLL 中,有时我试图获取类 MyClass 的实例,它实现了上面提到的类型库的 COM 接口(interface)。代码如下所示:

IInterfaceClassPtr dataPtr;
hr = dataPtr.CreateInstance(CLSID_MyClass);

IInterfaceClassPtr其实是一个Macro(这一切都是Visual Studio生成的),看起来像这样:

_COM_SMARTPTR_TYPEDEF(IExampleInterface, __uuidof(IExampleInterface));

IExampleInterface 在我使用的 Typelib 中定义,并由 MyClass 实现。

如果我使用 regsvr32 注册我自己的 DLL,一切正常。但我想避免这种情况,因为它需要管理员权限。

如果我的 DLL 注册,上述调用将失败并显示 HRESULT“0x80040154,类未注册”。我读了文章Registration free activation of COM-Components (还有其他一些)。但是我不能在这里调整消费应用程序的 list - 我试图激活的类 (MyClass) 与提到的“CreateInstance”调用存在于同一个 DLL 中。

我需要做什么才能使用 regsvr32 或某些 Manifest-Tweaking 创建这些类的实例?

最佳答案

您可以直接在 DLL 中创建对象的具体实例(假设类已在那里实现)。

CComObject<CMyClass>* pMyClassPtr;
CComObject<CMyClass>::CreateInstance(&pMyClassPtr);
pMyClassPtr->AddRef();

CComObject<T>::CreateInstance通过直接调用 new CComObject<T> 创建 COM 对象的实例所以它绕过了注册表。

然后您可以使用 QueryInterface在对象上获取所需的接口(interface)。

IInterfaceClassPtr spIInterface;
pMyClassPtr->QueryInterface(&spIInterface);

关于c++ - 在同一个 DLL 中使用 _COM_SMARTPTR CreateInstance 而无需注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41939010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com