【问题标题】:COM SafeArray of SafeArraySafeArray 的 COM 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)

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

【问题讨论】:

    标签: c++ atl idl


    【解决方案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*。
    猜你喜欢
    • 2018-04-27
    • 2011-11-06
    • 2013-06-16
    • 1970-01-01
    • 2019-06-28
    • 2012-05-14
    • 2011-10-15
    • 1970-01-01
    • 2016-02-24
    相关资源
    最近更新 更多