我有一个ATL COM服务器,其中接口(interface)的方法是

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的正确方法是什么?

最佳答案

我认为这里的问题是您使用的是用户定义类型(UDT)的SAFEARRAYSAFEARRAYVARIANTBSTRIUnknown可以直接使用,但对于UDT则需要帮助编码。请参阅MSDN中有关Passing Safearray of UDTs的文章。

关于c# - 如何将SAFEARRAY从C#传递到COM?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1425107/

10-17 00:25