您的位置首页百科问答

如何:使用 WRL 创建传统型 COM 组件

如何:使用 WRL 创建传统型 COM 组件

的有关信息介绍如下:

如何:使用 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 到链接器行。