我有一個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
如何我可以做到這一點嗎?
你永遠不會分配* myStruct。 –