2012-10-02 28 views
0

我有一個COM類(用C++開發,以防萬一它很重要),它有一個方法「GetStructList」,它應該返回一些自定義類型的列表,並且我正在開發一個.NET應用程序,它應該獲得該列表。如何從.Net中的COM類中獲取自定義結構(UDT)的數組?

我控制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 

如何我可以做到這一點嗎?

+0

你永遠不會分配* myStruct。 –

回答

1

什麼是生成的互操作簽名?

你會得到什麼確切的錯誤?

myStruct論點COM接口應該是[out],不[in, out]

是部分:

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

意思是:

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

但是,除非你有一個非常好的原因使用SAFEARRAYs(例如自動化兼容接口),我會建議使用普通陣列,因爲沒有必要打架與VT_RECORD的東西。

+0

謝謝,我努力在這個問題上省略SAFEARRAY這個詞,因爲我沒有任何理由使用SAFEARRAYs,任何返回數組的方式對我都有效。我認爲SAFEARRAYs已經成爲我的標準,因爲VB6調用的代碼太多。現在,我如何爲COM互操作定義一個正常的數組? – raven

+0

好吧,讓我找一些代碼工作... –

+0

如果你使用浮動而不是雙打,你會得到同樣的問題嗎? –

相關問題