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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top