2009-03-27 6 views
2

Comment puis-je connaître les propriétés et les méthodes des objets COM renvoyés par certaines fonctions .NET, qui ne semblent pas documentées?Comment puis-je me renseigner sur les fonctions non documentées de la bibliothèque .NET/COM?

Dans l'exemple particulier je regarde, j'insérer une image dans Excel à l'aide d'une fonction comme:

Set NewPic = ActiveSheet.Pictures.Insert(FileName) 

(Voir le poste SO sur ce here.)

Cependant, le MSDN documentation pour cette fonction indique seulement que Worksheet.Pictures renvoie un objet, et quand je mets un watch sur la variable pendant le débogage son type est System .__ ComObject. Puis-je savoir quelles autres propriétés et fonctions pourraient être disponibles pour cette classe (par exemple, je veux modifier le texte alternatif pour l'image)? Comment la personne qui a découvert la fonction Insert aurait-elle pu le savoir?

Le doc MSDN a aussi tendance à dire de telles fonctions qu'ils « ne sont pas destinés à être utilisés directement à partir de votre code », mais Ignorons que pour l'instant ...

Merci!


Edit: Eh bien, je réussi à répondre à ma question au moins. Au lieu d'utiliser Worksheet.Pictures.Insert, vous pouvez utiliser Worksheet.Shapes.AddPicture pour retourner un bon (documenté) classe Excel.Shape:

pic = range.Worksheet.Shapes.AddPicture(tmpFile, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, range.Left, range.Top, image.Width, image.Height) 
pic.AlternativeText = "Help!" 

serait toujours être intéressé par les ressources pour les fonctions non documentées bien.

+1

Il existe une bonne raison de ne pas utiliser de fonctions non documentées: elles peuvent changer ou être supprimées dans les futures versions. ... –

+1

Vous pouvez lire le blog de Raymond Chen. :) – BobbyShaftoe

+0

Je sais que vous utilisez simplement la collection Pictures comme exemple, mais par exemple, vous pouvez faire tout cela à partir du code en utilisant la collection de formes. Dans ce cas, je n'ai vraiment rien vu dans la collection Pictures dont vous auriez besoin. Cela semble globalement être vrai pour toutes les classes masquées dans l'API Office. Il y a d'autres raisons pour lesquelles les choses ne fonctionnent pas à partir de VBA> .NET - comme avec les raccourcis clavier, mais ce n'est pas vraiment dû au fait que les choses soient cachées. Une excellente réponse à cette question, une rédaction très complète de l'utilisation de l'outil OleView pour l'extraction IDL. –

Répondre

7

Une façon de trouver ces choses est d'utiliser l'outil OleView (que vous pouvez télécharger à partir de Microsoft here). Cet outil vous permet d'afficher les bibliothèques de type COM. La bibliothèque de types (en supposant que le fournisseur des informations de bibliothèque de types fournies par le composant COM) contient des informations sur les interfaces et les méthodes et propriétés des classes COM exposées par une application ou une bibliothèque.

Par exemple, sur mon ordinateur, je peux afficher la bibliothèque de types pour C:\Program Files\Microsoft Office\Office12\EXCEL.EXE et voir quels sont les objets COM exposés par Excel, ainsi que leurs propriétés et méthodes. OleView affiche des informations dans IDL (Interface Description Language), qui est plus ou moins un prototype de fonction C avec des attributs supplémentaires collés).

Ceci est la déclaration IDL je me suis à l'aide OleView pour la propriété __Worksheet.Pictures:

[id(0x00000303), hidden, helpcontext(0x00010303)] 
    HRESULT Pictures(
        [in, optional] VARIANT Index, 
        [in, lcid] long lcid, 
        [out, retval] IDispatch** RHS); 

Notez l'attribut hidden sur la déclaration. Cela signifie qu'il ne sera pas affiché par la plupart des IDE (et est un bon indice pour ne pas compter sur cette méthode toujours existante - Microsoft pourrait le supprimer dans une version ultérieure d'Excel).

Maintenant, qu'en est-il de la classe Pictures? Voici la IDL complète:

[ 
    uuid(000208A7-0000-0000-C000-000000000046), 
    helpcontext(0x00020067), 
    hidden 
] 
dispinterface Pictures { 
    properties: 
    methods: 
     [id(0x60000000), restricted] 
     void QueryInterface(
         [in] GUID* riid, 
         [out] void** ppvObj); 
     [id(0x60000001), restricted] 
     unsigned long AddRef(); 
     [id(0x60000002), restricted] 
     unsigned long Release(); 
     [id(0x60010000), restricted] 
     void GetTypeInfoCount([out] unsigned int* pctinfo); 
     [id(0x60010001), restricted] 
     void GetTypeInfo(
         [in] unsigned int itinfo, 
         [in] unsigned long lcid, 
         [out] void** pptinfo); 
     [id(0x60010002), restricted] 
     void GetIDsOfNames(
         [in] GUID* riid, 
         [in] char** rgszNames, 
         [in] unsigned int cNames, 
         [in] unsigned long lcid, 
         [out] long* rgdispid); 
     [id(0x60010003), restricted] 
     void Invoke(
         [in] long dispidMember, 
         [in] GUID* riid, 
         [in] unsigned long lcid, 
         [in] unsigned short wFlags, 
         [in] DISPPARAMS* pdispparams, 
         [out] VARIANT* pvarResult, 
         [out] EXCEPINFO* pexcepinfo, 
         [out] unsigned int* puArgErr); 
     [id(0x00000094), propget, helpcontext(0x00010094)] 
     Application* Application(); 
     [id(0x00000095), propget, helpcontext(0x00010095)] 
     XlCreator Creator(); 
     [id(0x00000096), propget, helpcontext(0x00010096)] 
     IDispatch* Parent(); 
     [id(0x00010003), restricted, hidden] 
     void _Dummy3(); 
     [id(0x0000025a), helpcontext(0x0001025a)] 
     VARIANT BringToFront(); 
     [id(0x00000227), helpcontext(0x00010227)] 
     VARIANT Copy(); 
     [id(0x000000d5), helpcontext(0x000100d5)] 
     VARIANT CopyPicture(
         [in, optional, defaultvalue(2)] XlPictureAppearance Appearance, 
         [in, optional, defaultvalue(-4147)] XlCopyPictureFormat Format); 
     [id(0x00000235), helpcontext(0x00010235)] 
     VARIANT Cut(); 
     [id(0x00000075), helpcontext(0x00010075)] 
     VARIANT Delete(); 
     [id(0x0000040f), helpcontext(0x0001040f)] 
     IDispatch* Duplicate(); 
     [id(0x00000258), propget, helpcontext(0x00010258)] 
     VARIANT_BOOL Enabled(); 
     [id(0x00000258), propput, helpcontext(0x00010258)] 
     void Enabled([in] VARIANT_BOOL rhs); 
     [id(0x0000007b), propget, helpcontext(0x0001007b)] 
     double Height(); 
     [id(0x0000007b), propput, helpcontext(0x0001007b)] 
     void Height([in] double rhs); 
     [id(0x0001000c), restricted, hidden] 
     void _Dummy12(); 
     [id(0x0000007f), propget, helpcontext(0x0001007f)] 
     double Left(); 
     [id(0x0000007f), propput, helpcontext(0x0001007f)] 
     void Left([in] double rhs); 
     [id(0x0000010d), propget, helpcontext(0x0001010d)] 
     VARIANT_BOOL Locked(); 
     [id(0x0000010d), propput, helpcontext(0x0001010d)] 
     void Locked([in] VARIANT_BOOL rhs); 
     [id(0x0001000f), restricted, hidden] 
     void _Dummy15(); 
     [id(0x00000254), propget, hidden, helpcontext(0x00010254)] 
     BSTR OnAction(); 
     [id(0x00000254), propput, hidden, helpcontext(0x00010254)] 
     void OnAction([in] BSTR rhs); 
     [id(0x00000269), propget, helpcontext(0x00010269)] 
     VARIANT Placement(); 
     [id(0x00000269), propput, helpcontext(0x00010269)] 
     void Placement([in] VARIANT rhs); 
     [id(0x0000026a), propget, helpcontext(0x0001026a)] 
     VARIANT_BOOL PrintObject(); 
     [id(0x0000026a), propput, helpcontext(0x0001026a)] 
     void PrintObject([in] VARIANT_BOOL rhs); 
     [id(0x000000eb), helpcontext(0x000100eb)] 
     VARIANT Select([in, optional] VARIANT Replace); 
     [id(0x0000025d), helpcontext(0x0001025d)] 
     VARIANT SendToBack(); 
     [id(0x0000007e), propget, helpcontext(0x0001007e)] 
     double Top(); 
     [id(0x0000007e), propput, helpcontext(0x0001007e)] 
     void Top([in] double rhs); 
     [id(0x00010016), restricted, hidden] 
     void _Dummy22(); 
     [id(0x0000022e), propget, helpcontext(0x0001022e)] 
     VARIANT_BOOL Visible(); 
     [id(0x0000022e), propput, helpcontext(0x0001022e)] 
     void Visible([in] VARIANT_BOOL rhs); 
     [id(0x0000007a), propget, helpcontext(0x0001007a)] 
     double Width(); 
     [id(0x0000007a), propput, helpcontext(0x0001007a)] 
     void Width([in] double rhs); 
     [id(0x0000026e), propget, helpcontext(0x0001026e)] 
     long ZOrder(); 
     [id(0x000005f8), propget, helpcontext(0x000105f8)] 
     ShapeRange* ShapeRange(); 
     [id(0x00000080), propget, helpcontext(0x00010080)] 
     Border* Border(); 
     [id(0x00000081), propget, helpcontext(0x00010081)] 
     Interior* Interior(); 
     [id(0x00000067), propget, helpcontext(0x00010067)] 
     VARIANT_BOOL Shadow(); 
     [id(0x00000067), propput, helpcontext(0x00010067)] 
     void Shadow([in] VARIANT_BOOL rhs); 
     [id(0x00000105), propget, helpcontext(0x00010105)] 
     BSTR Formula(); 
     [id(0x00000105), propput, helpcontext(0x00010105)] 
     void Formula([in] BSTR rhs); 
     [id(0x000000b5), helpcontext(0x000100b5)] 
     Picture* Add(
         [in] double Left, 
         [in] double Top, 
         [in] double Width, 
         [in] double Height); 
     [id(0x00000076), propget, helpcontext(0x00010076)] 
     long Count(); 
     [id(0x0000002e), helpcontext(0x0001002e)] 
     GroupObject* Group(); 
     [id(0x000000fc), helpcontext(0x000100fc)] 
     Picture* Insert(
         [in] BSTR Filename, 
         [in, optional] VARIANT Converter); 
     [id(0x000000aa), helpcontext(0x000100aa)] 
     IDispatch* Item([in] VARIANT Index); 
     [id(0xfffffffc), helpcontext(0x0000fffc)] 
     IUnknown* _NewEnum(); 
     [id(0x000000d3), helpcontext(0x000100d3)] 
     Picture* Paste([in, optional] VARIANT Link); 

De là, vous pouvez supposer que l'interface Pictures a une méthode Cut et Delete, ainsi qu'une propriété Item, entre autres.Cependant, notez que cette interface est également marquée hidden, ce qui (encore) est une bonne indication que vous ne devriez pas vraiment l'utiliser (oui, je sais que vous ignoriez cet avertissement, mais je seconde le commentaire de Mitch Wheat que c'est généralement un mauvais idée d'utiliser des classes cachées, car elles sont généralement destinées à l'usage interne de l'application et peuvent être modifiées sans préavis.)

+2

Super réponse, merci! J'accepterai presque certainement cela, je verrai juste si quelqu'un d'autre veut s'implanter en premier. Je suis d'accord avec toi et Mitch pour ne pas utiliser trop de fonctionnalités non documentées. Parfois, la curiosité prend le dessus! – Gavin

+1

Hehe. Je suis sans la curiosité. Parfois, quand je suis en VB6, je vais activer l'option "Afficher les membres cachés" dans le navigateur d'objets juste pour voir ce qui est là ;-) –

Questions connexes