在同一个DLL

时间:2017-01-30 15:00:23

标签: c++ windows winapi dll com

我正在尝试编写一个消耗系统中注册的Typelib(.tlb)的DLL。这个Typelib要求我用自己的类实现两个接口,并在Running Object Table中注册其中一个接口,我在使用Visual Studio 2015的ATL项目中做了这个。

使用我的 DLL的应用程序根本不应该知道COM,一切都应该在幕后工作,并且由我实现的DLL隐藏。

在我的DLL中,在某些时候我试图获得实现上述提到的Typelib的COM接口的clas MyClass的实例。代码如下所示:

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

IInterfaceClassPtr实际上是一个宏(所有这些都是由Visual Studio生成的),如下所示:

_COM_SMARTPTR_TYPEDEF(IExampleInterface, __uuidof(IExampleInterface));

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

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

如果我的DLL 已注册,则上述调用将失败并显示HRESULT" 0x80040154,Class未注册"。我阅读了文章Registration free activation of COM-Components(以及其他一些文章)。但是,我无法调整消费应用程序。在这里显示 - 类(MyClass)我试图激活与上面提到的" CreateInstance"相同的DLL中的生命。调用

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

1 个答案:

答案 0 :(得分:2)

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

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

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

然后,您可以在对象上使用QueryInterface来获取所需的界面。

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