2013-04-02 3 views
1

Я хочу передать вызов определенной функции на 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?

+0

Вы пробовали 'vips.Analyze4 (doc, 5L);'? Приведение его к объекту должно привести к «VT_BYREF | Насколько я помню, VT_UNKNOWN'. Так что он должен потерпеть неудачу ... – Carsten

+0

У меня есть. [Тот же результат.] (Http://i.snag.gy/7LfV9.jpg) –

+0

Вот и все! Замечательно! Можете ли вы опубликовать это снова как ответ, чтобы я мог отметить его, @HansPassant? –

ответ

2

Варианты возвращаются к середине 1990-х годов, когда долготы считались длинными для 32 бит. Это произошло через несколько лет после того, как появились первые 32-разрядные операционные системы, например, целое число было 16 бит в VB6. Не так в C# и .NET в целом, 32-битная среда программирования по дизайну, которой никогда не приходилось иметь дело с 16-битной обратной совместимостью. Поэтому используйте C# int, а не длинный.

Оставьте L из литерала.

+0

В то время 64-битные длинны были «длинными длинными». О, боль. –

Смежные вопросы