winRT Com组件开发:
1.编辑idl文件,winRT COM的idl文件与win32的idl文件有差异,如下:
interface ItestWinRTClass;
runtimeclass testWinRTClass;
[uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx), version(NTDDI_WIN8), exclusiveto(testWinRTClass)]
interface ItestWinRTClass : IInspectable
{
// Method
HRESULT SetChange(DWORD dwNewChange);
}
[version(NTDDI_WIN8), activatable(NTDDI_WIN8), marshaling_behavior(agile)]
runtimeclass testWinRTClass
{
[default]interface ItestWinRTClass;
}
2. 编辑.man文件,将注册信息写入.man文件。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassID\xxxxx
HKEY_CLASSES_ROOT\Interface\xxxxx
winRT COM中,主要起作用的是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassID\xxxxx这个注册表项,与传统win32的HKEY_CLASSES_ROOT\CLSID\xxxxx这个不同,在生成com对象时,主要搜索前一个注册表项,找到com的类和接口。
3.编写Module文件,将激活类的class factory写入module文件中。
4.编写xxx.h和xxx.cpp文件,实现类和接口。
// header file
class CtestWinRTClass: public RuntimeClass<ItestWinRTClass, FtmBase>
{
InspectableClass(RuntimeClass_xxx, PartialTrust);
public:
CtestWinRTClass();
IFACEMETHOD(SetChange)(DWORD dwNewChange) override;
private:
int m_test;
};
// source file
略
5.编译,生成xxx.h文件和xxx_i.c文件,给其他引用的类使用。
6.手动将注册表信息导入到target machine中。
7.将生成的.winmd文件拷贝到target machine中,.winmd文件是新的元数据,供运行时和编译阶段的引用使用,这是winRT的一个特色。
8.将生成的dll拷贝到target machine,即可运行。
9.测试,写一个UnitTest程序:
HRESULT hr;
ComPtr<ItestWinRTClass> ppiTest;
hr = ActivateInstance(StringReference(RuntimeClass_xxxx).Get(), ppiTest);
VERIFY_SUCCEEDED(hr, L"Windows::Foundation::ActivateInstance() xxx is activated");
hr = ppiTest->SetChange(100);
VERIFY_SUCCEEDED(hr, L"testWinRTClass->SetChange() calling is OK");