lilyonwind
lilyonwind

Reputation: 159

How to pass a SAFEARRAY from C# to COM?

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?

Upvotes: 5

Views: 6577

Answers (2)

Ghita
Ghita

Reputation: 4505

I think the answer to this question is similar to this one: COM - [in] parameter as SAFEARRAY(STRUCT)

Basically, the C# client that is using an interface where SAFEARRAY(STRUCT) are passed in, has to define Embed Interop Types = False on the imported COM server reference properties.

Upvotes: 0

Motti
Motti

Reputation: 114685

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.

Upvotes: 2

Related Questions