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

标签 c++ windows winapi dll com

我目前正在尝试编写一个 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/

相关文章:

c++ - 持有对自身的引用的类

windows - 使用 zlib 在 Win32 上构建 OpenSSL

c++ - Windows Media Foundation:IMFSourceReader::SetCurrentMediaType 执行时间问题

c++ - MAKE 的 GCcflags从哪里传递?

C++ string.length() 超出 string.at() 参数范围

c# - 进程间通信

c++ - 限制事件的发生

c++ - 无法在 Windows Store App 中访问 USB 设备

eclipse - git gc/git gui : Unlink of file <internal pack file name> failed

c++ - 低级键盘钩子(Hook) : callback not reached