Comment obtenir le GIT en Delphi 7?
-
21-08-2019 - |
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?
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.