Как передать SAFEARRAY из C # в COM? - PullRequest
4 голосов
/ 15 сентября 2009

У меня есть 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?

Ответы [ 2 ]

2 голосов
/ 21 октября 2009

Я думаю, что проблема здесь в том, что вы используете SAFEARRAY пользовательских типов (UDT), SAFEARRAY s из VARIANT, BSTR и IUnknown работают из коробки, но для UDT s вы должны помочь маршаллеру. См. Эту статью в MSDN, касающуюся Передачи Safearray UDTs .

0 голосов
/ 31 августа 2011

Я думаю, что ответ на этот вопрос похож на этот: COM - параметр [in] как SAFEARRAY (STRUCT)

По сути, клиент C #, использующий интерфейс, через который передается SAFEARRAY (STRUCT), должен определить Embed Interop Types = False в импортированных ссылочных свойствах COM-сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...