2011-03-03 85 views
0

嗨,繼承人很短的一個:短收到COMException問題

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

拋出一個類型不匹配0x80020005(DISP_E_TYPEMISMATCH)錯誤。

Close is expected OlInspectorClose alright,所以我不知道爲什麼會出現類型不匹配。

編輯:更清晰的代碼!

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

我不知道那個組件,但是調度接口支持枚舉嗎? – 2011-03-03 02:38:59

+0

這是一個MailItem,我試圖在上面的代碼中關閉一個Inspector。這可能是頁面,但它不能解釋爲什麼我的類型不匹配:http://msdn.microsoft.com/en-us/library/ff869503.aspx – Cat 2011-03-03 02:44:31

+1

它可能是* Inspect *索引器以及。打破這一點。 – 2011-03-03 02:46:37

回答

0

[編輯]不言自明的,你爲什麼不打電話:

inspect.Close(OlInspectorClose.olDiscard); 

既然你已經有檢查?

這就是C++的外觀(不完整)。類型庫的信息顯示,get_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; 

檢查員實施的這個索引樣子:

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

注意索引值聲明的對象。 Interop包裝器可能允許Inspector傳入,也可能是int。事實上,鑑於索引者也可能是一個整數,這似乎是可能的情況。根據你的錯誤,我認爲可能並非如此。

+0

我試過inspect.Close(OlInspectorClose.olDiscard),但同樣的異常仍然發生在我身上。我不知道C#中的任務是如何工作的,所以我試圖關閉應用程序的檢查器集合以保證安全。 – Cat 2011-03-03 20:08:29

+0

這很有趣。你有完整的項目可以放在什麼地方嗎?我很想看看檢查員來自哪裏。 – 2011-03-03 20:53:15

+0

@Cat - FWIW,當使用索引器(並假設它工作)時,您只需在已有的Inspector對象實例上調用Close即可。 – 2011-03-03 23:05:20