带C+的C#ArrayList+;互操作

带C+的C#ArrayList+;互操作,c#,c++,com,clr,com-interop,C#,C++,Com,Clr,Com Interop,这是用C写的# 在互操作的C++侧,调用了调用KeKe3()后,得到了包含数组的变量Vista/Stand,但如何“提取”它?< /P> (例如,我想获得项目的数量等)这是一个(变体是一个包装器,来自comdef.h/\import语句),它包含一个引用,因此您可以使用IDispatch的方法,例如(省略错误检查): variant\t v; HRESULT hr=unk->GetList(&v);//获取包含ArrayList引用的我的变量 //获取“Count”方法dispid LPOLES

这是用C写的#

在互操作的C++侧,调用了调用KeKe3()后,得到了包含数组的<强>变量Vista/Stand,但如何“提取”它?< /P> (例如,我想获得项目的数量等)

这是一个(
变体
是一个包装器,来自
comdef.h
/
\import
语句),它包含一个引用,因此您可以使用
IDispatch
的方法,例如(省略错误检查):

variant\t v;
HRESULT hr=unk->GetList(&v);//获取包含ArrayList引用的我的变量
//获取“Count”方法dispid
LPOLESTR countName=(LPOLESTR)L“Count”;
DISPID DISPID count;
hr=V_DISPATCH(&V)->GetIDsOfNames(IID_NULL,&countName,DISPATCH_方法,0,&dispidCount);
DISPPARAMS dp={nullptr,nullptr,0,0};
变异计数;
hr=V_DISPATCH(&V)->Invoke(dispidCount,IID_NULL,0,DISPATCH_方法,&dp,&count,nullptr,nullptr);
//获取“Item(i)”方法dispid
LPOLESTR itemName=(LPOLESTR)L“Item”;
DISPID DISPID名称;
hr=V_DISPATCH(&V)->GetIDsOfNames(IID_NULL,&itemName,DISPATCH_方法,0,&dispidName);
对于(int i=0;iInvoke(dispidName,IID_NULL,0,DISPATCH_方法,&dpIndex,&item,nullptr,nullptr);
//项可以是标量值
//字符串=>VT_BSTR、Int32=>VT_I4等。
//或另一个ComVisible对象=>VT_分派、VT_未知等。
}
这是一个(
variant\u t
是一个来自
comdef.h
/
#import
语句的包装器),它包含一个引用,因此您可以使用
IDispatch
的方法,例如(省略错误检查):

variant\t v;
HRESULT hr=unk->GetList(&v);//获取包含ArrayList引用的我的变量
//获取“Count”方法dispid
LPOLESTR countName=(LPOLESTR)L“Count”;
DISPID DISPID count;
hr=V_DISPATCH(&V)->GetIDsOfNames(IID_NULL,&countName,DISPATCH_方法,0,&dispidCount);
DISPPARAMS dp={nullptr,nullptr,0,0};
变异计数;
hr=V_DISPATCH(&V)->Invoke(dispidCount,IID_NULL,0,DISPATCH_方法,&dp,&count,nullptr,nullptr);
//获取“Item(i)”方法dispid
LPOLESTR itemName=(LPOLESTR)L“Item”;
DISPID DISPID名称;
hr=V_DISPATCH(&V)->GetIDsOfNames(IID_NULL,&itemName,DISPATCH_方法,0,&dispidName);
对于(int i=0;iInvoke(dispidName,IID_NULL,0,DISPATCH_方法,&dpIndex,&item,nullptr,nullptr);
//项可以是标量值
//字符串=>VT_BSTR、Int32=>VT_I4等。
//或另一个ComVisible对象=>VT_分派、VT_未知等。
}

回避了一个问题:为什么你要使用
ArrayList
而不是
List
,因为我不知道如何在C++中用variant公开泛型?回避了一个问题:为什么你要使用
ArrayList
而不是
List
,因为我不知道如何在C++Merci Simon中用variant公开泛型,你是阿维兹-安可-人生!谢谢西蒙,你要再来一次!
public static ArrayList MyFct() 
{
  var x = new ArrayList();
  x.Add(5);
  return x
}
variant_t v;
HRESULT hr = unk->GetList(&v); // get my VARIANT that contains an ArrayList reference

// get "Count" method dispid
LPOLESTR countName = (LPOLESTR)L"Count";
DISPID dispidCount;
hr = V_DISPATCH(&v)->GetIDsOfNames(IID_NULL, &countName, DISPATCH_METHOD, 0, &dispidCount);

DISPPARAMS dp = { nullptr, nullptr, 0, 0 };
variant_t count;
hr = V_DISPATCH(&v)->Invoke(dispidCount, IID_NULL, 0, DISPATCH_METHOD, &dp, &count, nullptr, nullptr);

// get "Item(i)" method dispid
LPOLESTR itemName = (LPOLESTR)L"Item";
DISPID dispidName;
hr = V_DISPATCH(&v)->GetIDsOfNames(IID_NULL, &itemName, DISPATCH_METHOD, 0, &dispidName);

for (int i = 0; i < V_I4(&count); i++)
{
    // build index as variant
    variant_t index(i);
    DISPPARAMS dpIndex = { &index, nullptr, 1, 0 };

    // get item(i)
    variant_t item;
    hr = V_DISPATCH(&v)->Invoke(dispidName, IID_NULL, 0, DISPATCH_METHOD, &dpIndex, &item, nullptr, nullptr);

    // item can be a scalar value
    // String => VT_BSTR, Int32 => VT_I4, etc.
    // or another ComVisible object => VT_DISPATCH, VT_UNKNOWN, etc.
}