gpt4 book ai didi

c++ - 在 WinRT 组件中跨 ABI 边界编码 VARIANT

转载 作者:太空狗 更新时间:2023-10-29 20:44:56 25 4
gpt4 key购买 nike

我正在移植我们的组件,该组件的核心是用 C++ 编写的,同时具有 ActiveX 和 .Net 外壳。该组件内部在许多地方使用了 VARIANT 类型。该组件参数的一些公共(public)属性(get/set)和方法在 ActiveX 实现中是 VARIANT 类型,在 .Net 实现中是 System::Object。在我们的代码内部,我们直接使用 VARIANT。

在实现 ActiveX 组件时,我不需要进行任何编码(marshal)处理,因为 VARIANT 是一种 OLE/COM 类型。

在实现.Net组件时,我使用了类似这样的:

VARIANT var;

//...

//Initialize the VARIANT value

//...


System::IntPtr p( &var );

System::Object ^o = System::Runtime::InteropServices::Marshal::GetObjectForNativeVariant(p );

return o;

在 WinRT 中,似乎没有任何类似的 Marshal 类可以完成这项工作。根据 MSDN,“WinRT Platform::Runtime::InteropServices 命名空间仅供内部使用,不适用于开发。”

我有哪些选择?当然必须有一个现有的类来完成跨 ABI 边界编码 VARIANT 的工作。我不想写这样一个编码器然后发现它已经存在了!

如有任何帮助,我们将不胜感激。

最佳答案

感谢您的回复。我最终使用 Windows::Foundation::IPropertyValue 编写了一个实用程序类。

我在这里发布了代码以及返回该线程的链接:

Marshalling a VARIANT in a WinRT component

例子:

// in a C# we can write:
string [] sarray = new string[2];
sarray[0] = "abc";
sarray[1] = "def";

SetValue(sarray);

//in C++/CX we write:
void SetValue( Object ^value )
{
VARIANT var;
VariantInit( &var );

var = acMarshall::MarshalObjectToVariant( value );
//
// We will have a SAFEARRAY of BSTRs in the VARIANT...
//
VariantClear( &var );
}

// and the reverse, in C++/CX
Object ^ GetValue()
{
VARIANT var;
VariantInit(&var);

v.vt = VT_BSTR | VT_ARRAY;

SAFEARRAYBOUND sab;
sab.cElements = 2;
sab.lLbound = 0;
SAFEARRAY *psa = SafeArrayCreate( VT_BSTR, 1, &sab );
LPVOID p = NULL;
SafeArrayAccessData( psa, &p );

((BSTR *) p)[0] = SysAllocString(L"string one");
((BSTR *) p)[1] = SysAllocString(L"string two");

SafeArrayUnaccessData( psa );
var.parray = psa;

Object ^ obj = acMarshall::MarshalVariantToObject( var );
VariantClear( &var );

return obj;
}

//and in C#:
object obj = GetValue() //obj will contain a string array...

问候,

罗杰

关于c++ - 在 WinRT 组件中跨 ABI 边界编码 VARIANT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11936639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com