Я хочу передать вызов определенной функции на C#. Эти две строки следующим образом:Как мне вызвать COM-функцию с параметром _variant_t (тип «long»)?
m_pBrowserApp->get_Document(&pVoid);
m_pLayoutAnalyzer->Analyze4(pVoid, _variant_t(5L));
m_pBrowserApp
является объектом браузера ActiveX и pVoid
является его собственностью документ. Я могу получить это, позвонив WebBrowserBase.ActiveXInstance.Document
. Однако я не знаю, как создать _variant_t(5L)
в C#. Поскольку вызов не является VT_BYREF, это «должно работать», называя это так:
ILayoutAnalyzer2 vips = new LayoutAnalyzer2();
vips.Initialize(0);
SHDocVw.WebBrowser_V1 axBrowser = (SHDocVw.WebBrowser_V1)this.webBrowser1.ActiveXInstance;
var doc = axBrowser.Document as mshtml.HTMLDocument;
vips.Analyze4(doc, (Object)5L); // fails with HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH)
Но это не так. Он не работает с ошибкой DISP_E_TYPEMISMATCH
. Я уверен, что свойство Document действительно. Таким образом, остается вопрос: как правильно передать длинный завернутый в вариант через interop?
Вы пробовали 'vips.Analyze4 (doc, 5L);'? Приведение его к объекту должно привести к «VT_BYREF | Насколько я помню, VT_UNKNOWN'. Так что он должен потерпеть неудачу ... – Carsten
У меня есть. [Тот же результат.] (Http://i.snag.gy/7LfV9.jpg) –
Вот и все! Замечательно! Можете ли вы опубликовать это снова как ответ, чтобы я мог отметить его, @HansPassant? –