SafeArray 的 COM SafeArray

Posted

技术标签:

【中文标题】SafeArray 的 COM SafeArray【英文标题】:COM SafeArray of SafeArray 【发布时间】:2012-08-03 11:47:50 【问题描述】:

我的 IDL 中有以下内容,MIDL 似乎很喜欢。我正在尝试创建一个返回字节数组(不是矩阵)的方法。我在 C++ 端遇到问题,编译器不喜欢 ATL::CComSafeArray<LPSAFEARRAY>ATL::CComSafeArray<ATL::CComSafeArray<byte> >。我收到了error C2039: 'type' : is not a member of 'ATL::_ATL_AutomationType<T>'

[id(1001)] HRESULT Find([out] SAFEARRAY(SAFEARRAY(byte))* features);

STDMETHOD(Find)(/*[out]*/ SAFEARRAY** features)

有没有更好的方法来传递字节数组(我正在跨越进程边界)?

【问题讨论】:

【参考方案1】:

好的,试试这个(C++ ATL EXE 服务器):

[
    object,
    uuid(F7F8E65F-EBAD-4191-B916-2DB2A1EA0720),
    dual,
    nonextensible,
    helpstring("IAofA Interface"),
    pointer_default(unique)
]
interface IAofA : IDispatch
    [id(1), helpstring("method GetArray")] HRESULT GetArray([out,retval] VARIANT* pVals);
;

CComVariant CreateByteArrayAsVariant(BYTE *pData, ULONG size)

    CComSafeArray<BYTE> sa(size);
    for (ULONG i=0; i!=size; ++i)
    
        sa.SetAt(i, pData[i]);
    

    CComVariant var(sa);

    return var;



STDMETHODIMP CAofA::GetArray(VARIANT* pVals)

    CComSafeArray<VARIANT> sa(3);

    BYTE a[] = 1;
    BYTE b[] = 1, 2;
    BYTE c[] = 3, 2, 1;

    sa.SetAt(0, CreateByteArrayAsVariant(a, sizeof(a)));
    sa.SetAt(1, CreateByteArrayAsVariant(b, sizeof(b)));
    sa.SetAt(2, CreateByteArrayAsVariant(c, sizeof(c)));

    CComVariant var(sa);

    var.Detach(pVals);

    return S_OK;

这是一个 VB.net 客户端:

Imports AofAServerLib

Module Module1

    Sub Main()
        Dim s As IAofA = New AofA
        Dim a() = s.GetArray

        For i As Integer = 0 To a.Length - 1
            For j As Integer = 0 To a(i).Length - 1
                Console.Write(a(i)(j))
                Console.Write(" ")
            Next
            Console.WriteLine()
        Next
    End Sub

End Module

没有错误检查,但它可以工作。

【讨论】:

这是要走的路。您不能创建安全数组元素的安全数组(请参阅SafeArrayCreate() 函数的限制),但您可以创建变体元素的安全数组,每个元素都包含一个安全数组。 我想知道是否有一些关于 VB.NET 和 VARIANT 的特定内容,但我似乎无法使用 C# 客户端进行这项工作。 好的,我成功了。我对 VT 类型有一些问题。对于任何感兴趣的人,IDL 方法可以是 [out] SAFEARRAY(VARIANT)* 而不是 [out] VARIANT*

以上是关于SafeArray 的 COM SafeArray的主要内容,如果未能解决你的问题,请参考以下文章

C# 中如何使用 safearray 安全数组

SAFEARRAY使用实例

将 SAFEARRAY 从 c++ 返回到 c#

如何实现 SAFEARRAY(long) 参数?

如何将 SAFEARRAY(字节数组)放入 HTML 隐藏字段

如何在 C++ 中创建和初始化双精度的 SAFEARRAY 以传递给 C#