Domanda

Sto cercando di ottenere la Tabella di Interfaccia Globale utilizzando il seguente codice (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;

Tuttavia, CoCreateInstance lancia una "Classe Non Registrata" eccezione.E infatti:in HKCR/CLSID non c'è alcuna voce per {00000146 - ecc.}.

Che dll o ocx deve essere registrato, per ottenere questa definizione nel registro di sistema?O sto facendo è totalmente sbagliato?

È stato utile?

Soluzione

Ecco la mia unità che lo fa. Ho messo questo insieme quando ero compilazione in D2006, ma non vedo il motivo per cui sarebbe stato diverso in D7. Io lo uso per la memorizzazione di un'interfaccia a un server DCOM e la condivisione fra più thread.

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.

Altri suggerimenti

Hai definito CLSID_StdGlobalInterfaceTable in modo non corretto:hai fornito il GUID dell'interfaccia, piuttosto che una classe concreta.

Non ho il file di intestazione Windows in tutto, quindi non posso controllare contro di loro, ma una ricerca suggerisce che dovrebbe essere:

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

Hai usato OleView32 per verificare il GUID della classe? Questo programma di utilità è disponibile in Windows SDK e consente di raggiungere a piedi il Registro di sistema di interfacce molto più facile di regedit. Direi che l'utilità come un must per qualsiasi sviluppo COM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top