0

カスタムタイプのリストを返すメソッド「GetStructList」を持つCOMクラス(念のためC++で開発)があり、そのリストを取得する.NETアプリケーションを開発しています。

アプリケーションだけでなく COM クラス コードも制御していますが、データを取得できません。

COM クラス コード:

1- IDL:

HRESULT GetList([in,out] SAFEARRAY(struct MyStruct)* myStructs);
// I have also tried with [out] instead of [in, out]

[uuid(628913FC-CC26-1654-472F-0B70CC39DEE0)]
struct MyStruct
{
    int myInt;
    DOUBLE myDouble;

};

2-CPP:

STDMETHODIMP MyClass::GetList(SAFEARRAY** myStructs)
{
    SAFEARRAY* psa = *myStructs;
    SAFEARRAYBOUND sab = {someSize, 0};
    MyStruct *pData;
    IRecordInfo *pRI;
    HRESULT hr;

    hr = GetRecordInfoFromGuids(LIBID_MyCOMLib, 1, 0, 0x409, __uuidof(MyStruct), &pRI);
    psa = SafeArrayCreateEx(VT_RECORD, 1, &sab, pRI);
    pRI->Release();
    pRI = NULL;
    hr = SafeArrayAccessData(psa, (void**)&pData);
    for (size_t i = 0; i < someSize; i++) 
    {
        pData[i].myInt = someInt;
        pData[i].myDouble = somedouble;
    }
    hr = SafeArrayUnaccessData(psa);

    return S_OK;
}

.Net コード (VB):

Option Strict
...
<MarshalAs(UnmanagedType.SafeArray, safearraysubtype:=VarEnum.VT_RECORD)>
Private m_List As MyStruct()

Private Sub btnGetList_Click(sender As System.Object, e As System.EventArgs) 
    Dim m_List() As MyStruct
    m_ComObject.GetList(m_List) 

    ' I have tried several other things, getting different errors with each of them'
    'm_ComObject.GetList(CType(m_List, Array))'

    'Dim structs() As MyStruct'
    'Dim arr as System.Array = structs '
    'm_ComObject.GetList(arr)'

    For Each o In cortes
        Dim s As MyStruct = CType(o, MyStruct)
        MsgBox(s.myInt)
        Exit For
    Next
End Sub

どうすればこれを達成できますか?

4

1 に答える 1

1

生成された相互運用署名とは何ですか?

どのような正確なエラーが発生しますか?

myStructCOM インターフェイスの引数は である必要があります[out][in, out]

パーツは次のとおりです。

Dim m_List() As SceneCutInfo
m_ComObject.GetList(m_List) 

であることになっている:

Dim m_List() As MyStruct
m_ComObject.GetList(m_List) 

ただし、SAFEARRAY を使用する本当に正当な理由 (Automation 準拠のインターフェイスなど) がない限り、VT_RECORD と戦う必要がないため、通常の配列を使用することをお勧めします。

于 2012-10-02T12:12:29.623 に答える