2009-09-17 53 views
0

我想要做一些Internet Explorer自動化任務,它需要我使用IViewObject。什麼是IViewObject?我在哪裏可以找到它的定義?什麼是IViewObject和它如何在C#中使用

我一直在谷歌和我發現的一切有不同的接口定義IViewObject。不同的方法或不同的參數進入相同的方法。

我怎麼知道什麼接口定義與Internet Explorer一起使用?

這是一個定義,我對pinvoke.net

[GuidAttribute("0000010d-0000-0000-C000-000000000046")] 
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] 
[ComImportAttribute()] 
public interface IViewObject 
{ 
    void Draw([MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, DVTARGETDEVICE ptd, IntPtr hdcTargetDev, IntPtr hdcDraw, COMRECT lprcBounds, COMRECT lprcWBounds, IntPtr pfnContinue, int dwContinue); 
    int GetColorSet([MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, DVTARGETDEVICE ptd, IntPtr hicTargetDev, out tagLOGPALETTE ppColorSet); 
    int Freeze([MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, out IntPtr pdwFreeze); 
    int Unfreeze([MarshalAs(UnmanagedType.U4)] int dwFreeze); 
    int SetAdvise([MarshalAs(UnmanagedType.U4)] int aspects, [MarshalAs(UnmanagedType.U4)] int advf, [MarshalAs(UnmanagedType.Interface)] IAdviseSink pAdvSink); 
    void GetAdvise([MarshalAs(UnmanagedType.LPArray)] out int[] paspects, [MarshalAs(UnmanagedType.LPArray)] out int[] advf, [MarshalAs(UnmanagedType.LPArray)] out IAdviseSink[] pAdvSink); 
} 

我只想試試這個定義中找到,但我得到了幾個類型的未知:DVTARGETDEVICE,COMRECT,tagLOGPALETTE。所以我的下一個問題是,需要引用哪些程序集來使用這些類型?

回答

3

DVTARGETDEVICE和COMRECT是結構。您可以在pinvoke.net上找到他們的定義。

tagLOGPALETTE是一個類。有一個樣品可在http://blogs.msdn.com/vsod/archive/2008/11/01/resizing-the-embedded-ole-objects-using-net.aspx

另外,IViewObject和三個引用類型都在.NET Framework內部使用。如果您自己獲取Reflector的副本(http://www.red-gate.com/products/reflector/),則可以查看System.Windows.Forms.UnsafeNativeMethods中的現有實現。

+0

它是如何有很多不同的實現呢? Microsoft.VisualStudio.Ole.Interop具有與System.Windows.Forms.UnsafeNativeMethods中使用的IViewObject不同的實現。 – 2009-09-17 14:27:36

+1

不同之處在於託管類型和非託管類型之間的映射細節,它們在編譯時未經過驗證。一般來說,可能有不止一種方式來剝皮/調用貓,但至少有一些可能的方法可能在至少一些情況下被炸。例如,如果非託管方法返回64位整數,但您的p/invoke聲明將返回類型聲明爲32位整數,那麼您的調用將一直運行,直到您點擊的值過大,位整數。 – 2009-09-17 15:43:13

相關問題