¿Cómo obtener el GIT en Delphi 7?
-
21-08-2019 - |
Pregunta
Estoy intentando obtener la tabla de interfaz global usando el siguiente código (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;
Sin embargo, CoCreateInstance genera una excepción de "Clase no registrada".Y de hecho:en HKCR/CLSID no hay ninguna entrada para {00000146-etc.}.
¿Qué dll u ocx se debe registrar para obtener esta definición en el registro?¿O lo estoy haciendo totalmente mal?
Solución
Aquí está mi unidad que lo hace. Pongo esto juntos cuando estaba compilando en D2006, pero no veo por qué sería diferente en D7. Lo uso para el almacenamiento de una interfaz a un servidor DCOM y compartirlo entre varios subprocesos.
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.
Otros consejos
Ha definido CLSID_StdGlobalInterfaceTable incorrectamente:ha proporcionado el GUID de la interfaz en lugar de una clase concreta.
No tengo los archivos de encabezado de Windows, por lo que no puedo compararlos, pero una búsqueda sugiere que debería ser:
CLSID_StdGlobalInterfaceTable: TGUID = '{00000323-0000-0000-C000-000000000046}';
¿Ha utilizado OleView32 para verificar el GUID de la clase? Que la utilidad está disponible en el SDK de Windows y le permite caminar el registro de interfaces mucho más fácil que regedit. Yo clasificaría la utilidad como una necesidad para cualquier desarrollo COM.