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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top