编写经典的COM组件与Windows运行时类相比有一些优势。经典的COM组件是使用C++编写的,因此在性能方面可能更高效。此外,经典的COM组件可以被许多不同的编程语言调用,而Windows运行时类主要是为C++/CX开发的。
下面是一个经典的COM组件的代码示例,展示了如何编写一个简单的COM组件:
// MyCOMComponent.h
#pragma once
#include
class __declspec(dllexport) MyCOMComponent : public IUnknown
{
public:
// IUnknown methods
STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
// Custom methods
STDMETHOD(DoSomething)();
};
// MyCOMComponent.cpp
#include "MyCOMComponent.h"
ULONG g_refCount = 0;
STDMETHODIMP MyCOMComponent::QueryInterface(REFIID riid, void** ppvObject)
{
if (riid == __uuidof(IUnknown))
{
*ppvObject = static_cast(this);
AddRef();
return S_OK;
}
else if (riid == __uuidof(MyCOMComponent))
{
*ppvObject = this;
AddRef();
return S_OK;
}
else
{
*ppvObject = nullptr;
return E_NOINTERFACE;
}
}
STDMETHODIMP_(ULONG) MyCOMComponent::AddRef()
{
return InterlockedIncrement(&g_refCount);
}
STDMETHODIMP_(ULONG) MyCOMComponent::Release()
{
ULONG refCount = InterlockedDecrement(&g_refCount);
if (refCount == 0)
{
delete this;
}
return refCount;
}
STDMETHODIMP MyCOMComponent::DoSomething()
{
// Implementation of DoSomething method
return S_OK;
}
在上面的示例中,我们创建了一个简单的COM组件MyCOMComponent
,该组件实现了IUnknown
接口和一个自定义的方法DoSomething
。在QueryInterface
方法中,我们检查请求的接口是否为IUnknown
或MyCOMComponent
,然后返回相应的指针。
这只是一个简单的示例,实际上还有更多的COM接口和方法可以实现。在使用COM组件时,我们需要使用CoCreateInstance
函数来实例化组件,并使用QueryInterface
方法获取所需的接口。
虽然COM组件可能需要更多的代码来实现,但它们具有广泛的语言支持和更高的性能,因此在某些情况下可能是更好的选择。然而,对于特定的应用场景,Windows运行时类可能更适合,特别是在使用C++/CX进行开发时。
上一篇:编写警报提示