2009-09-17 5 views
0

J'essaie de faire quelques tâches d'automatisation d'Internet Explorer et cela me demande d'utiliser IViewObject. Qu'est-ce que IViewObject? Où puis-je trouver sa définition?Qu'est-ce que IViewObject et comment est-il utilisé dans C#

J'ai été google-ing et tout ce que je trouve a une définition d'interface différente pour IViewObject. Différentes méthodes ou différents paramètres entrant dans les mêmes méthodes. Comment connaître la définition de l'interface à utiliser avec Internet Explorer?

C'est une définition que je trouve sur 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); 
} 

Je voudrais juste essayer cette définition, mais je reçois quelques types qui sont inconnus: DVTARGETDEVICE, COMRECT, tagLOGPALETTE. Donc ma question suivante est, quel assemblage doit être référencé pour utiliser ces types?

Répondre

3

DVTARGETDEVICE et COMRECT sont des structures. Vous pouvez trouver leurs définitions sur pinvoke.net.

tagLOGPALETTE est une classe. Il y a un échantillon disponible au http://blogs.msdn.com/vsod/archive/2008/11/01/resizing-the-embedded-ole-objects-using-net.aspx.

En outre, IViewObject et les trois types référencés sont tous utilisés en interne par le .NET Framework. Si vous récupérez une copie de Reflector (http://www.red-gate.com/products/reflector/), vous pouvez afficher les implémentations existantes dans System.Windows.Forms.UnsafeNativeMethods.

+0

Comment se fait-il qu'il y ait beaucoup de différentes implémentations de ceci? Microsoft.VisualStudio.Ole.Interop a une implémentation différente de IViewObject que celle utilisée dans System.Windows.Forms.UnsafeNativeMethods. –

+1

Les différences résident dans les détails du mappage entre les types gérés et non gérés, qui ne sont pas vérifiés lors de la compilation. En général, il peut y avoir plus d'une façon d'écraser un chat p/invoke, mais au moins certaines des approches possibles peuvent exploser dans au moins quelques scénarios. Par exemple, si une méthode non gérée renvoie un entier de 64 bits mais que votre déclaration p/invoke déclare que le type de retour est un entier de 32 bits, votre appel fonctionnera jusqu'au jour où vous frappez une valeur trop grande pour un 32- bit entier. –

Questions connexes