【问题标题】:How to pass a SAFEARRAY from C# to COM?如何将 SAFEARRAY 从 C# 传递到 COM?
【发布时间】:2009-09-15 04:23:46
【问题描述】:

我有一个ATL COM Server,接口的方法是

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

【问题讨论】:

    标签: c# com


    【解决方案1】:

    我认为这里的问题是您正在使用用户定义类型 (UDT) 的 SAFEARRAYVARIANTBSTRIUnknownSAFEARRAYs 开箱即用,但对于 @ 987654327@s 你需要帮助编组员。请参阅 MSDN 中有关 Passing Safearray of UDTs 的这篇文章。

    【讨论】:

    • 我也有同样的问题。有没有办法做到这一点 ?文章从原生客户端的角度提到了一些东西……
    【解决方案2】:

    我认为这个问题的答案类似于这个问题: COM - [in] parameter as SAFEARRAY(STRUCT)

    基本上,使用传入 SAFEARRAY(STRUCT) 的接口的 C# 客户端必须在导入的 COM 服务器引用属性上定义 Embed Interop Types = False

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-12
      • 2013-06-16
      • 2011-10-15
      • 2010-11-02
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      相关资源
      最近更新 更多