Wie die GIT in Delphi 7 zu bekommen?
-
21-08-2019 - |
Frage
Ich versuche, das Global Interface Table zu erhalten, indem Sie den folgenden Code verwenden (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;
Allerdings wirft CoCreateInstance eine „Klasse nicht registriert“ Ausnahme. Und in der Tat:. In HKCR / CLSID gibt es keinen Eintrag für {00000146- usw.}
Welche oder ocx dll registriert werden soll, diese Definition in der Registrierung zu bekommen? Oder bin ich es total falsch?
Lösung
Hier ist meine Einheit, die es tut. Ich habe dies zusammen, als ich in D2006 kompilieren, aber ich sehe nicht, warum es wäre anders in D7 sein. Ich benutze es für eine Schnittstelle zu einem DCOM-Server zu speichern und zwischen mehreren Threads zu teilen.
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.
Andere Tipps
Sie haben festgelegt CLSID_StdGlobalInterfaceTable falsch. Sie die GUID der Schnittstelle geliefert haben, eher als eine konkrete Klasse
Ich habe nicht die Header-Windows-Dateien um, so kann ich gegen sie nicht überprüfen, aber eine Suche schlägt vor, es sein sollte:
CLSID_StdGlobalInterfaceTable: TGUID = '{00000323-0000-0000-C000-000000000046}';
Haben Sie OleView32 die GUID der Klasse zu überprüfen? Das Programm ist im Windows SDK verfügbar und ermöglicht es Ihnen, die Registrierung von Schnittstellen viel einfacher als regedit zu gehen. Ich würde klassifizieren den Nutzen als eine für jede COM Entwicklung haben muss.