我有一个ATL COM服务器,接口的方法是
CVivsBasic::UpdateSwitchPlan(BSTR plan_name, SAFEARRAY* plan)
这个函数的IDL看起来像
typedef struct
{
LONG time_to_play;
BSTR ecportid;
} SwitchPlanItem;
HRESULT UpdateSwitchPlan([in] BSTR plan_name, [in] SAFEARRAY(SwitchPlanItem) plan) ;
我试着用C#这样调用它:
internal void UpdateSwitch(string plan_name, string ecportid)
{
SwitchPlanItem sp1;
sp1.time_to_play = 33;
sp1.ecportid = ecportid;
SwitchPlanItem sp2;
sp2.time_to_play = 33;
sp2.ecportid = ecportid;
SwitchPlanItem[] sps = { sp1, sp2 };
sdk.UpdateSwitchPlan(plan_name, sps);
}
但它崩溃了.将SAFEARRAY从C#传递给COM的正确方法是什么?
最佳答案 我认为这里的问题是你正在使用SAFEARRAY的用户定义类型(UDT),VARIANT的SAFEARRAY,BSTR和IUnknown开箱即用,但对于UDT,你需要帮助编组.有关
Passing Safearray of UDTs,请参阅MSDN中的这篇文章.