tags:

views:

986

answers:

1

I have an ATL COM Server, where the method for the interface is

CVivsBasic::UpdateSwitchPlan(BSTR plan_name, SAFEARRAY* plan)

And the IDL for this function looks like

typedef struct  
{   
    LONG time_to_play;
    BSTR ecportid;
} SwitchPlanItem;
HRESULT UpdateSwitchPlan([in] BSTR plan_name, [in] SAFEARRAY(SwitchPlanItem) plan) ;

I tried to call it from C# like this:

        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);
    }

But it crash. What is the correct way to pass a SAFEARRAY from C# to COM?

+1  A: 

I think the problem here is that you're using a SAFEARRAY of user defined types (UDT), SAFEARRAYs of VARIANT, BSTR and IUnknown work out of the box but for UDTs you need to help the marshaller along. See this article in MSDN regarding Passing Safearray of UDTs.

Motti