C++ 在WinRT组件中跨ABI边界编组变量

C++ 在WinRT组件中跨ABI边界编组变量,c++,windows-runtime,variant,C++,Windows Runtime,Variant,我移植了以C++为核心的组件,既有ActiveX又有.Net外壳。组件在许多地方内部使用变体类型。此组件参数的某些公共属性(get/set)和方法在ActiveX实现中为变量类型,在.Net实现中为System::Object。在代码内部,我们直接使用变体 在实现ActiveX组件时,我不需要执行任何封送处理,因为VARIANT是OLE/COM类型 在实现.Net组件时,我使用了类似的方法: VARIANT var; //... //Initialize the VARIANT value

我移植了以C++为核心的组件,既有ActiveX又有.Net外壳。组件在许多地方内部使用变体类型。此组件参数的某些公共属性(get/set)和方法在ActiveX实现中为变量类型,在.Net实现中为System::Object。在代码内部,我们直接使用变体

在实现ActiveX组件时,我不需要执行任何封送处理,因为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中,似乎没有任何类似的封送处理类来完成这项工作。根据MSDN,“WinRT Platform::Runtime::InteropServices命名空间仅供内部使用,不用于开发。”

我有什么选择?当然,必须有一个现有的类来完成跨ABI边界编组变体的工作。我不想写这样的封送员,然后发现它已经存在

任何帮助都将不胜感激。

在Windows运行时中没有“变体”等价物。在ABI级别,System::Object表示为实现IInspectable的对象,这可能是一种可以用来替换变量的机制


可以使用IReference创建基于IInspectable的接口,该接口表示更高级别的对象,但它不会具有VARIANT所具有的弱类型语义。

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

我在这里发布了代码,并返回到该线程的链接:

例如:

// 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++代码需要使用一个弱类型对象,比如变量?或者你能用强类型对象替换它吗?MSDN中的相关问题有一个不同的答案:不确定“不会有变体所具有的弱类型语义”是什么意思。我能够使用
IPropertyValue
get\u Type
方法实现这一点。(类似于@Roger的回答。)我要说的是,从C程序员的角度来看,
变量
更易于使用,比
IPropertyValue
的内存开销更少,并且没有那些不必要的虚拟调用。变量的类型很弱-您可以在变量中输入int,然后输出字符串(或反之亦然,或任何其他类型的转换-请参阅VariantChangeType函数)。IPropertyValue是强类型的-您只能获取输入的属性类型。