将clsid与运行时类关联起来,以便在外部DLL中延迟绑定运行时类。
以下是一个示例,展示如何在Windows Runtime Component中使用winrt::create_instance函数来动态创建COM对象:
// HelloWorldComponent.h
namespace HelloWorldComponent
{
public ref class HelloWorld sealed
{
public:
void SayHello();
};
}
// HelloWorldComponent.cpp
#include "pch.h"
#include "HelloWorldComponent.h"
using namespace winrt;
// 获取运行时类
namespace
{
// 此类包装了Windows.Foundation.IInspectable接口,提供了一个方便的RefPtr/NULL检查的构造函数
class inspectable : public implements
{
public:
inspectable(void* p = nullptr) : m_ptr(p) {}
Windows::Foundation::IInspectable get() const { return m_ptr; }
private:
Windows::Foundation::IInspectable m_ptr;
};
// 获取指定CLSID对应的运行时对象
void get_runtime_object(winrt::hstring const& clsid, inspectable& object)
{
// 调用Windows API来获取IActivationFactory
winrt::hstring typeName(L"");
auto hr = ::CLSIDFromProgID(clsid.c_str(), &object.get_object()->m_pObjectIID);
if (hr != S_OK)
{
winrt::throw_hresult(hr);
}
winrt::check_hresult(::CoGetClassObject(__uuidof(Windows::Foundation::IActivationFactory),
CLSCTX_INPROC_SERVER,
nullptr,
IID_PPV_ARGS(&object)));
object.get_object()->m_pObject->ActivateInstance(&object.get());
}
}
namespace HelloWorldComponent
{
void HelloWorld::SayHello()
{
// 动态获取COM对象的CLSID
winrt::hstring clsid(L"HelloWorldCOMServer.HelloWorldObject");
inspectable instance;
get