Question

Je suis en train d'obtenir le Global Interface Table en utilisant le code suivant (Delphi):

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.}

Ce qui dll ou OCX doit être enregistré, pour obtenir cette définition dans le registre? Ou suis-je le fais tout à fait tort?

Était-ce utile?

La solution

Voici mon unité qu'il fait. Je mets cela ensemble quand je compilait dans D2006, mais je ne vois pas pourquoi ce serait différent dans D7. Je l'utilise pour stocker une interface vers un serveur DCOM et de le 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.

Autres conseils

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

Je n'ai pas les fichiers d'en-tête de Windows autour, donc 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}';

Avez-vous utilisé OleView32 pour vérifier le GUID de la classe? Cette utilité est disponible dans le SDK Windows et vous permet de marcher le registre des interfaces beaucoup plus facile que regedit. Je qualifierais l'utilité comme un must have pour tout développement COM.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top