Reputation: 159
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
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
Reputation: 114685
I think the problem here is that you're using a SAFEARRAY
of user defined types (UDT), SAFEARRAY
s of VARIANT
, BSTR
and IUnknown
work out of the box but for UDT
s you need to help the marshaller along. See this article in MSDN regarding Passing Safearray of UDTs.
Upvotes: 2