如何从.Net中的COM类获取自定义结构(UDT)数组? 我有一个COM类(C++开发,以防万一),它有一个方法“GeStuttListSet”,它应该返回一些自定义类型的列表,我正在开发一个.NET应用程序,应该得到那个列表。
我控制COM类代码和应用程序,但无法获取数据 COM类代码: 1-IDL:如何从.Net中的COM类获取自定义结构(UDT)数组? 我有一个COM类(C++开发,以防万一),它有一个方法“GeStuttListSet”,它应该返回一些自定义类型的列表,我正在开发一个.NET应用程序,应该得到那个列表。,.net,com,interop,com-interop,vb.net-2010,.net,Com,Interop,Com Interop,Vb.net 2010,我控制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 myDo
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;
}
STDMETHODIMP MyClass::GetList(安全数组**myStructs)
{
安全阵列*psa=*myStructs;
SAFEARRAYBOUND sab={someSize,0};
MyStruct*pData;
IRecordInfo*pRI;
HRESULT-hr;
hr=GetRecordInfoFromGuids(LIBID\u mycommlib,1,0,0x409,\u\u uuidof(MyStruct),&pRI);
psa=SafeArrayCreateX(VT_记录,1和sab,pRI);
pRI->Release();
pRI=NULL;
hr=安全阵列访问数据(psa,(作废**)和pData);
对于(大小i=0;i
.Net代码(VB):
选项严格
...
作为MyStruct()的私有m_列表
私有子btnGetList\单击(发送者作为System.Object,e作为System.EventArgs)
将m_List()作为MyStruct进行调整
m_ComObject.GetList(m_List)
“我尝试过其他几种方法,每种方法都有不同的错误”
'm_ComObject.GetList(CType(m_List,Array))'
“Dim structs()作为MyStruct”
'Dim arr as System.Array=structs'
'm_ComObject.GetList(arr)'
对于cortes中的每个o
作为MyStruct=CType的Dim s(o,MyStruct)
MsgBox(s.myInt)
退出
下一个
端接头
如何实现这一点?生成的互操作签名是什么 你得到的确切错误是什么 COM接口中的
myStruct
参数应该是[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_记录内容进行斗争。谢谢,我尽量省略问题中的SAFEARRAYs一词,因为我没有任何理由使用SAFEARRAYs,任何返回数组的方法对我都是有效的。我认为安全阵列已经成为我的标准,因为从VB6调用了太多的代码。现在,我如何为COM互操作定义一个普通数组?如果使用浮点而不是双精度,是否会遇到同样的问题?是的,“SceneCutInfo”是原始结构名,我忘记再次更改它;我现在已经修好了。错误主要是空引用。错误使用浮点而不是双精度来持续。我发布的确切代码似乎没有使用选项Strict On编译,因此我正在传递CType(m_List,Array)isntead,而只是m_List.Hmm,我终于解决了这个问题。我不确定我做错了什么,但现在它起作用了。现在,我应该使用什么来代替安全阵列?如果我使用MyStruct*,那么我不知道数组长度。。。
Dim m_List() As MyStruct
m_ComObject.GetList(m_List)