kaixuan1115 / notes

笔记收录
6 stars 0 forks source link

不注册COM组件直接调用接口 #29

Closed xiaokaixuan closed 4 years ago

xiaokaixuan commented 4 years ago

偶尔有一些的特殊的场合需要将COM组件单纯当做动态链接库使用,比如一些绿色软件。

本文以COM组件AppTest.dll为例,AppTest.dll中提供了ITest接口,在不使用regsvr32命令向系统注册的情况下创建ITest接口并调用。

一、导入组件或类型库;

在C++中使用COM组件,组件需要带有类型库,以公开接口和方法。类型库文件类型为tlb文件,直接#import导入即可。类型库也可以以资源形式编译进COM组件Dll内部,资源类型为TYPELIB,资源号为1即可。如果Dll中已包含类型库,只需#import导入COM组件Dll文件即可。代码如下:

#import "AppTest.dll"

二、动态载入COM组件并创建接口。

ITestPtr pTest = NULL;
do
{
    HMODULE hMudule = ::LoadLibrary(_T("AppTest.dll"));
    if (!hModule) break;
    IClassFactoryPtr pClassFactory = NULL;
    pfnDllGetClassObject pDllGetClassObject = (pfnDllGetClassObject)::GetProcAddress(hMudule, "DllGetClassObject");
    if (!pDllGetClassObject) break;
    HRESULT hr = pDllGetClassObject(__uuidof(AppTest::Test), IID_IClassFactory, (LPVOID*)&pClassFactory);
    if (S_OK != hr) break;
    hr = pClassFactory->CreateInstance(NULL, __uuidof(AppTest::ITest), (LPVOID*)&pTest);
    if (S_OK != hr) break;
    AfxMessageBox(_T("Succeed !"));
}
while (0);