Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从.Net中的COM类获取自定义结构(UDT)数组? 我有一个COM类(C++开发,以防万一),它有一个方法“GeStuttListSet”,它应该返回一些自定义类型的列表,我正在开发一个.NET应用程序,应该得到那个列表。_.net_Com_Interop_Com Interop_Vb.net 2010 - Fatal编程技术网

如何从.Net中的COM类获取自定义结构(UDT)数组? 我有一个COM类(C++开发,以防万一),它有一个方法“GeStuttListSet”,它应该返回一些自定义类型的列表,我正在开发一个.NET应用程序,应该得到那个列表。

如何从.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

我控制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;
}
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)