我正在尝试编写一个消耗系统中注册的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创建这些类没有的实例?
答案 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);