2009-07-01 10 views
4

Je suis en train d'obtenir le Global Interface Table en utilisant le code suivant (Delphi):Comment obtenir le GIT dans Delphi 7?

uses Comobj, ActiveX; 

var 
    cGIT : IGlobalInterfaceTable = NIL; 
const 
    CLSID_StdGlobalInterfaceTable: TGUID = '{00000146-0000-0000-C000-000000000046}'; 


function GIT : IGlobalInterfaceTable; 
begin 
    if (cGIT = NIL) then 
     OleCheck (CoCreateInstance (CLSID_StdGlobalInterfaceTable, NIL, 
            CLSCTX_ALL, IGlobalInterfaceTable, cGIT)); 
    Result := cGIT; 
end; 

Cependant, CoCreateInstance renvoie une exception "Classe non enregistrée". Et en effet: dans HKCR/CLSID il n'y a pas d'entrée pour {00000146- etc.}.

Quel dll ou ocx devrait être enregistré, pour obtenir cette définition dans le registre? Ou est-ce que je le fais totalement faux?

+0

Cette fonction, à condition que vous utilisez ceci: TGUID = '{00000323-0000-0000-C000-000000000046} Merci aux deux intervenants pour fournir cette réponse. –

Répondre

7

Voici mon unité qui le fait. J'ai mis cela ensemble quand je compilais en D2006, mais je ne vois pas pourquoi ce serait différent en D7. Je l'utilise pour stocker une interface sur un serveur DCOM et la partager entre plusieurs threads.

unit GlobalInterfaceTable; 

interface 

uses Types, 
    ActiveX; 

type 
    IGlobalInterfaceTable = interface(IUnknown) 
    ['{00000146-0000-0000-C000-000000000046}'] 
    function RegisterInterfaceInGlobal (pUnk : IUnknown; const riid: TIID; out dwCookie : DWORD): HResult; stdcall; 
    function RevokeInterfaceFromGlobal (dwCookie: DWORD): HResult; stdcall; 
    function GetInterfaceFromGlobal (dwCookie: DWORD; const riid: TIID; out ppv): HResult; stdcall; 
    end; 

    function GIT: IGlobalInterfaceTable; 

implementation 

uses ComObj; 

const 
    CLSID_StdGlobalInterfaceTable : TGUID = '{00000323-0000-0000-C000-000000000046}'; 

function GIT: IGlobalInterfaceTable; 
begin 
    // This function call always returns the singleton instance of the GIT 
    OleCheck(CoCreateInstance (CLSID_StdGlobalInterfaceTable, NIL, CLSCTX_ALL, IGlobalInterfaceTable, Result)); 
end; 

end. 
+0

+1 pour une solution complète. – skamradt

+0

C'est génial. Je pensais que le ClassID devait aussi être trouvé dans le registre. Mais ce n'est pas! Allez comprendre. Merci pour cette réponse !! –

+0

De rien.Pour être honnête, je pense que tu étais presque là. Plutôt que d'analyser tous les différents bits que tout le monde avait posté, je pensais juste que je posterais le lot que je savais travaillé. ;-) –

5

Vous avez mal défini CLSID_StdGlobalInterfaceTable: vous avez fourni le GUID de l'interface plutôt qu'une classe concrète.

Je n'ai pas les fichiers d'en-tête de Windows autour, je ne peux pas vérifier contre eux, mais une recherche suggère qu'il devrait être:

CLSID_StdGlobalInterfaceTable: TGUID = '{00000323-0000-0000-C000-000000000046}'; 
+0

Telle est la définition de ActiveX.pas (source delphi): {$ EXTERNALSYM IGlobalInterfaceTable} IGlobalInterfaceTable = interface (IUnknown) [ '{00000146-0000-0000-C000-000000000046}'] fonction RegisterInterfaceInGlobal (const pUnk: IUnknown; const riid: TIID; out dwCookie: DWORD): HResult; stdcall; function RevokeInterfaceFromGlobal (dwCookie: DWORD): HResult; stdcall; fonction GetInterfaceFromGlobal (dwCookie: DWORD; const riid: TIID; out ppv): HResult; stdcall; fin; 00000323 n'est pas dans le registre –

+0

Rocky, ActiveX.pas donne l'IID de l'interface, pas le CLSID de la classe qui implémente l'interface. Vous avez mal défini votre constante CLSID. A part ça, il n'y a rien de mal avec votre code. –

+0

Mon commentaire précédent n'est pas très clair. La dernière phrase devrait être: {00000323- etc} n'est pas non plus dans le registre. –

2

Avez-vous utilisé OleView32 pour vérifier le GUID de la classe ? Cet utilitaire est disponible dans le Windows SDK et vous permet de parcourir le registre des interfaces beaucoup plus facilement que regedit. Je classerais l'utilité comme un must pour n'importe quel développement COM.

+0

Je ne connaissais pas cet utilitaire. Maintenant, pour la question 100000 $: quelle classe devrais-je rechercher avec cet utilitaire. Ou comment dois-je rechercher la classe IGlobalInterfaceTable? –

+0

Vous pouvez rechercher les interfaces, et je crois qu'une fois que vous en sélectionnez un, vous pouvez le sélectionner pour creuser dans une liste de qui implémente cette interface. Malheureusement, je ne l'ai pas sur cette machine (je ne fais rien pour le moment), mais cela aide à trouver des choses comme les DLL qui enregistrent l'interface, les méthodes disponibles et la possibilité de marcher dans la chaîne d'héritage. – skamradt

Questions connexes