2009-07-01 9 views
4

Ich versuche, das Global Interface Table mit dem folgenden Code (Delphi) zu erhalten:Wie bekomme ich das GIT in Delphi 7?

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; 

jedoch CoCreateInstance eine "Klasse nicht registriert" Ausnahme auslöst. Und tatsächlich: In HKCR/CLSID gibt es keinen Eintrag für {00000146- etc.}.

Welche DLL oder OCX sollte registriert werden, um diese Definition in der Registrierung zu erhalten? Oder mache ich es total falsch?

+0

Diese Funktion funktioniert, vorausgesetzt, Sie verwenden diese: TGUID = '{00000323-0000-0000-C000-000000000046}' Dank beiden commen für diese Antwort bereitstellt. –

Antwort

7

Hier ist meine Einheit, die es tut. Ich habe das zusammengefügt, als ich in D2006 kompiliert habe, aber ich sehe nicht, warum es in D7 anders wäre. Ich verwende es zum Speichern einer Schnittstelle zu einem DCOM-Server und teilen Sie es zwischen mehreren Threads.

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. 
+0

+1 für eine vollständige Lösung. – skamradt

+0

Das ist brilliant. Ich dachte, dass die ClassID auch in der Registrierung gefunden werden musste. Aber es ist nicht! Stelle dir das vor. Vielen Dank für diese Antwort !! –

+0

Gern geschehen.Um ehrlich zu sein, ich denke du warst fast da. Anstatt all die verschiedenen Teile zu analysieren, die jeder gepostet hatte, dachte ich nur, dass ich das Los posten würde, von dem ich wusste, dass es funktionierte. ;-) –

5

Sie haben CLSID_StdGlobalInterfaceTable falsch definiert: Sie haben die GUID der Schnittstelle anstelle einer konkreten Klasse angegeben.

Ich habe nicht die Windows-Header-Dateien um, so kann ich gegen sie nicht überprüfen, aber eine Suche schlägt es sein sollte:

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

Dies ist die Definition von ActiveX.pas (delphi Quelle): {$ EXTERNALSYM IGlobalInterfaceTable} IGlobalInterfaceTable = interface (IUnknown) [ '{00000146-0000-0000-C000-000000000046}'] Funktion RegisterInterfaceInGlobal (const pUnk: IUnknown; const riid: TIID; aus dwCookie: DWORD): HResult; stdcall; Funktion RevokeInterfaceFromGlobal (dwCookie: DWORD): HResult; stdcall; Funktion GetInterfaceFromGlobal (DWCookie: DWORD; const riid: TIID; aus ppv): HResult; stdcall; Ende; 00000323 ist nicht in der Registrierung –

+0

Rocky, ActiveX.pas gibt die IID der Schnittstelle, nicht die CLSID der Klasse, die die Schnittstelle implementiert. Sie haben Ihre CLSID-Konstante falsch definiert. Ansonsten ist nichts falsch mit Ihrem Code. –

+0

Mein vorheriger Kommentar ist nicht sehr klar. Der letzte Satz sollte lauten: {00000323- usw.} ist auch nicht in der Registrierung. –

2

Haben Sie OleView32 verwendet, um die GUID der Klasse zu überprüfen ? Dieses Dienstprogramm ist im Windows SDK verfügbar und ermöglicht es Ihnen, die Registrierung von Schnittstellen viel einfacher als regedit zu gehen. Ich würde das Dienstprogramm als ein Muss für jede COM-Entwicklung einstufen.

+0

Ich wusste nichts über dieses Dienstprogramm. Jetzt für die $ 100000 Frage: welche Klasse sollte ich mit diesem Dienstprogramm suchen. Oder wie soll ich nach der IGlobalInterfaceTable-Klasse suchen? –

+0

Sie können die Schnittstellen durchsuchen, und ich glaube, sobald Sie eine auswählen, können Sie sie auswählen, um in eine Liste zu graben, wer diese Schnittstelle implementiert. Leider habe ich es nicht auf dieser Maschine (im Moment keine Arbeit zu tun), aber es hilft Dinge zu finden, wie DLL registriert die Schnittstelle, welche Methoden verfügbar sind, und die Fähigkeit, die Vererbungskette zu gehen. – skamradt