问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-06 04:31

我来回答

1个回答

热心网友 时间:2022-06-28 17:49

  在 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<ClassicCom> 指定类派生自 IUnknown 而不是。IInspectableIInspectable (仅对 应用商店 组件) 创建 CoCreatableClass 应用。可以使用函数的类的工厂 CoCreateInstance。
  C++
  #include "stdafx.h"

  #include "CalculatorComponent_h.h"
  #include <wrl.h>

  using namespace Microsoft::WRL;

  class CalculatorComponent: public RuntimeClass<RuntimeClassFlags<ClassicCom>, 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::Mole 类管理模块的类工厂。
  C++
  #include "stdafx.h"
  #include <wrl\mole.h>

  using namespace Microsoft::WRL;

  #if !defined(__WRL_CLASSIC_COM__)
  STDAPI DllGetActivationFactory(_In_ HSTRING activatibleClassId, _COM_Outptr_ IActivationFactory** factory)
  {
  return Mole<InProc>::GetMole().GetActivationFactory(activatibleClassId, factory);
  }
  #endif

  #if !defined(__WRL_WINRT_STRICT__)
  STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, _COM_Outptr_ void** ppv)
  {
  return Mole<InProc>::GetMole().GetClassObject(rclsid, riid, ppv);
  }
  #endif

  STDAPI DllCanUnloadNow()
  {
  return Mole<InProc>::GetMole().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 到链接器行。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小白开始做牛腩烧番茄前,应该做哪些准备? 普洱茶不管是纯料还是拼配它本身就很有意思 普洱茶的纯料VS拼配,谁更值得珍藏? 为什么我们听到熟悉的歌曲的音乐会感觉在唱歌词呢? abs制动防抱死系统什么时候用到 请问有谁知道离朝阳北路的煊特嘉园(炫特区)最近的浩沙健身俱乐部在哪 ... 朝阳北苑郊野公园有哪些 北苑哪些公园 北京北苑健身有哪些 王者荣耀黄忠开大怎么转圈 Computer start up problem.... 急!!!在ANSYS的post26中如何用esol命令,输出单元节点的位移,esol的item和comp好像想没有这一项啊。。 “solution”怎么读? solution的动词是什麽? solution是可数还是不可数? comp up with 等于什么 solution to do 还是 doing? 请问:solution company 该如何翻译? 能否将oracle undo_retention 的值设置成无限大 小米有一款是竹子的后壳是什么款 小米手机3发布会 小米木质手机的那一款式 小米4可以换后盖吗 小米4要怎样免费换木质后盖? 小米木质后盖 哪种值得买 小米note的实木后盖怎么脱下来!!急 小米note实木后盖和3d后盖哪个好 请教下,CAD画梯形台如何画,说明下,梯形台2个侧面的倾角不同,麻烦尽量说的详细些。 小米手机后盖到底什么材质最好 小米什么手机是木后盖 卡巴斯基2009扫描出的漏洞怎样解决,如果在www.viruslist.com中solution不提共网址链接怎么办? &#47;usr&#47;bin中的python3.6m 中的m是什么意思?和python3.6有什么区别? ansys里面X-component of rotation什么意思,有谁能解释一下dof solution下面各项的意思吗 oracle update set 福特福睿斯跑高速飘吗?它的噪音大吗? 福特福睿斯跑高速怎么样 福特福睿斯的操控怎么样?跑高速飘吗? 福睿斯跑高速d挡和s挡那个更省油 长安福特福睿斯新车是拉高速好还是拉低速好? 福睿斯和宝来跑高速哪个好 福特福睿斯的性价比高吗?它的油耗高吗? 福睿斯手自一体,高速d档拨s档不用加档吧 福特福睿斯首保后能拉多少码 局域网内有什麽可以用的IM工具?像QQ一样的 局域网内支持多系统的IM 云服务器的IM软件如何在公司内网运行? 局域网即时通讯工具有哪些软件 公司内部想用一款局域网内的聊天工具,有一些开发的台机是linux系统的,有合适的IM推荐嘛? 可以不架设服务器的局域网即时通讯工具有哪些? 不用服务器的局域网即时通讯工具