Come ottenere il GIT in Delphi 7?
-
21-08-2019 - |
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?
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.