如何:使用 WRL 创建传统型 COM 组件
的有关信息介绍如下:
在 Visual Studio 中创建新的 Blank Solution 项目 例如,将项目命名为WRLClassicCOM。 向解决方案添加新的 Win32 Project 项目。 例如,将项目命名为CalculatorComponent。 在 应用程序设置 选项卡,选择 DLL(D)。 将属性组添加到项目Midl File (.idl) 文件。 给定文件,例如,CalculatorComponent.idl。 将此代码添加到 CalculatorComponent.idl: C++ import "ocidl.idl"; [uuid(0DBABB94-CE99-42F7-ACBD-E698B2332C60), version(1.0)] interface ICalculatorComponent : IUnknown { HRESULT Add([in] int a, [in] int b, [out, retval] int* value); } [uuid(9D3E6826-CB8E-4D86-8B14-89F0D7EFCD01), version(1.0)] library CalculatorComponentLib { [uuid(E68F5EDD-6257-4E72-A10B-4067ED8E85F2), version(1.0)] coclass CalculatorComponent { [default] interface ICalculatorComponent; } }; 在 CalculatorComponent.cpp,定义 CalculatorComponent 类。 CalculatorComponent 类从继承。Microsoft::WRL::RuntimeClass Microsoft::WRL::RuntimeClassFlags 指定类派生自 IUnknown 而不是。IInspectableIInspectable (仅对 应用商店 组件) 创建 CoCreatableClass 应用。可以使用函数的类的工厂 CoCreateInstance。 C++ #include "stdafx.h" #include "CalculatorComponent_h.h" #include using namespace Microsoft::WRL; class CalculatorComponent: public RuntimeClass, ICalculatorComponent> { public: CalculatorComponent() { } STDMETHODIMP Add(_In_ int a, _In_ int b, _Out_ int* value) { *value = a + b; return S_OK; } }; CoCreatableClass(CalculatorComponent); 使用以下代码替换该 dllmain.cpp 的代码。 此文件定义 DLL 导出函数。 这些函数使用 Microsoft::WRL::Module 类管理模块的类工厂。 C++ #include "stdafx.h" #include using namespace Microsoft::WRL; #if !defined(__WRL_CLASSIC_COM__) STDAPI DllGetActivationFactory(_In_ HSTRING activatibleClassId, _COM_Outptr_ IActivationFactory** factory) { return Module::GetModule().GetActivationFactory(activatibleClassId, factory); } #endif #if !defined(__WRL_WINRT_STRICT__) STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, _COM_Outptr_ void** ppv) { return Module::GetModule().GetClassObject(rclsid, riid, ppv); } #endif STDAPI DllCanUnloadNow() { return Module::GetModule().Terminate() ? S_OK : S_FALSE; } STDAPI_(BOOL) DllMain(_In_opt_ HINSTANCE hinst, DWORD reason, _In_opt_ void*) { if (reason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hinst); } return TRUE; } 添加 模块定义文件 (.def) 文件添加到项目中。 给定文件,例如,CalculatorComponent.def。 此文件给出了添加要导出到此文件的函数名。 将此代码添加到 CalculatorComponent.def: def LIBRARY EXPORTS DllGetActivationFactory PRIVATE DllGetClassObject PRIVATE DllCanUnloadNow PRIVATE 添加 runtimeobject.lib 到链接器行。