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