如何创建独立<UINT32>窗口 COM 接口
How to create IReference<UINT32> windows COM interface
我面临MSVC COM接口创建问题:COM API需要__FIReference_1_UINT32类型参数,该参数也是IReference类型。
virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Value(
/* [out][retval] */ __RPC__deref_out_opt __FIReference_1_UINT32 **value) = 0;
virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Value(
/* [in] */ __RPC__in_opt __FIReference_1_UINT32 *value) = 0;
我尝试了RoActivateInstance函数。但它得到了非注册类错误。
ComPtr<__FIReference_1_UINT32_t> fValue;
const wchar_t str[] = __FIReference_1_UINT32_t::z_get_rc_name_impl();//L"Windows.Foundation.IReference1<UInt32>";
hr = RoActivateInstance(HString::MakeReference(str).Get(), &fValue);
如果有人能给我一些提示,我真的很感激。
我刚刚遇到了类似的问题,并做了一些挖掘。我发现,正如所评论的,C++/CX语言扩展实现了IBox以支持引用类型,它的实现似乎完全在链接的winmd lib文件中,因此它对ISO C++不可用。我能够通过重用我已经拥有的一些助手类来创建一个基本版本,即IReference的com对象impl,从而使我的案例发挥作用。它为IInspectable方法返回E_NOTIMPL,并使用基于"堆栈"的com对象语义,这对于我不希望保留对holder对象的com引用的简单setter来说应该是可以的。
// variadic template QueryInterface impl
template <typename T, typename I, typename... Rest>
inline HRESULT Qi(T * t, const IID& riid, void** ppvObject)
{
if (riid == __uuidof(I))
{
I * i = static_cast<I*>(t);
i->AddRef();
*ppvObject = i;
return S_OK;
}
return Qi<T, Rest...>(t, riid, ppvObject);
}
// variadic terminator
template <typename T>
inline HRESULT Qi(T *, const IID&, void** ppvObject)
{
*ppvObject = nullptr;
return E_NOINTERFACE;
}
// com object with 'stack' based semantics
template <typename I1, typename... I2>
class __declspec(novtable) StackObject : public I1, public I2...
{
typedef StackObject Self;
protected:
virtual ~StackObject() {}
public:
HRESULT STDMETHODCALLTYPE QueryInterface(const IID& riid, void** ppvObject) override
{
if (!ppvObject)
{
return E_POINTER;
}
if (riid == __uuidof(IUnknown) || riid == __uuidof(I1))
{
*ppvObject = static_cast<IUnknown*>(static_cast<I1*>(this));
return S_OK;
}
return Qi<Self, I2...>(this, riid, ppvObject);
}
ULONG STDMETHODCALLTYPE AddRef() override
{
return 2;
}
ULONG STDMETHODCALLTYPE Release() override
{
return 1;
}
};
// Reference impl
template <typename T>
class Reference sealed : public StackObject<ABI::Windows::Foundation::IReference<T>>
{
T val;
public:
Reference() : val {}
{}
Reference(T value) : val(value)
{}
private:
HRESULT STDMETHODCALLTYPE GetIids(ULONG *iidCount, IID **iids) override
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE GetRuntimeClassName(HSTRING *className) override
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE GetTrustLevel(TrustLevel *trustLevel) override
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE get_Value(T *value) override
{
*value = val;
return S_OK;
}
};
然后用作…
Reference<UINT32> value(666);
CheckHr(object->put_Value(&value));
相关文章:
- EASTL矢量<向量<int>>连续的
- memcpy 是将浮子打包到 uint32 中的标准方法吗?
- 警告C4018,包含int和UINT32,但不包含int和UCHAR
- 为什么 UInt64 变量不能包含大于 UInt32::Max 的值?
- C++:从 "const variable*" 转换为"uint32"会失去精度
- 从指针到 uint32 的类型转换
- 为什么当我使用双精度时,Qt<->Matlab 正确写入和读取我的字节,但存储 uint32 的字节不正确?
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- uint32, int16, uint8 .为什么这些常用的数据类型没有进入标准
- C 字符串比较“祝您好运”&gt;“再见”
- 将字符 * 转换为 uint16 和 uint32
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何将UINT8*施放到UINT32
- 从4个浮子创建UINT32
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型