如何从C#中的SAFEARRAY传递给COM?(How to pass a SAFEARRAY fr

2019-08-06 05:36发布

我有一个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);
    }

但它崩溃。 什么是从C#中的SAFEARRAY传递给COM正确的方法是什么?

Answer 1:

我觉得这里的问题是,您使用的是SAFEARRAY用户定义类型(UDT), SAFEARRAYVARIANTBSTRIUnknown工作开箱即用,但对于UDT是你需要帮助这一编组。 请参阅本文关于MSDN 传递的UDT SAFEARRAY 。



Answer 2:

我认为这个问题的答案是类似这样的: COM - [中]参数作为SAFEARRAY(结构)

基本上,这是使用其中SAFEARRAY(STRUCT)被传递中的接口C#客户端,必须定义嵌入互操作类型=对进口COM服务器参考属性



文章来源: How to pass a SAFEARRAY from C# to COM?
标签: c# com