简短的COMException问题

时间:2011-03-03 02:18:43

标签: c# .net visual-studio-2010 outlook vsto

嘿伙计们,这是一个短暂的:

Globals.ThisAddIn.Application.Inspectors[Inspect].Close(OlInspectorClose.olDiscard);

引发类型不匹配0x80020005(DISP_E_TYPEMISMATCH)错误。

关闭期待OlInspectorClose正常,所以我不知道为什么会出现类型不匹配。

编辑:更清晰的代码!

public void Inspectors_Kill(Inspector Inspect)
    {
        Global.InspectorWrappers[Inspect].CustomTaskPane.Dispose();           
        Globals.ThisAddIn.Application.Inspectors[Inspect].Close(OlInspectorClose.olDiscard);
        Global.InspectorWrappers.Remove(Inspect);
    }

1 个答案:

答案 0 :(得分:0)

[编辑]说明显而易见的,你为什么不打电话:

 inspect.Close(OlInspectorClose.olDiscard);

既然您已经有检查员了吗?

这就是C ++的样子(不完整)。类型库信息显示get_Inspectors返回Inspectors列表:

virtual HRESULT __stdcall get_Inspectors (/*[out,retval]*/ struct _Inspectors * * Inspectors ) = 0;

导入:

#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE14\mso.dll" no_namespace
#import "C:\Program Files\Microsoft Office\OFFICE14\msoutl.olb" rename_namespace("Outlook")

利用智能包装器,访问看起来像这样:

_ApplicationPtr app("Outlook.Application");
_InspectorsPtr list = app->GetInspectors();
_InspectorPtr i = list->Item(0);
i->Close(OlInspectorClose::olDiscard);

请注意,我正在将一个整数索引传递给Item函数。在C#包装器中,接口声明如下所示:

    [DispId(282)]
    Inspectors _Application.Inspectors { [DispId(282)] get;

Inspectors实现的这个索引器看起来像:

    [DispId(0)]
    Inspector this[[MarshalAs(UnmanagedType.Struct), In] object Index] { [DispId(0)] get; }

请注意,索引器值被声明为对象。 interop包装器可以传入Inspector,也可以传入int。事实上,这似乎是可能的情况,因为索引器也会作为一个整数编组。根据您的错误,我认为情况可能并非如此。