簡體   English   中英

如何將SAFEARRAY從C#傳遞到COM?

[英]How to pass a SAFEARRAY from C# to COM?

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

但是它崩潰了。 將SAFEARRAY從C#傳遞到COM的正確方法是什么?

我覺得這里的問題是,您使用的是SAFEARRAY用戶定義類型(UDT), SAFEARRAYVARIANTBSTRIUnknown工作開箱即用,但對於UDT就是你需要幫助一起編組。 請參閱MSDN中有關傳遞UDT的Safearray的文章。

我認為這個問題的答案與此類似: COM-[in]參數為SAFEARRAY(STRUCT)

基本上,使用傳入SAFEARRAY(STRUCT)的接口的C#客戶端必須在導入的COM服務器引用屬性上定義Embed Interop Types = False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM