如何在Delphi 7中获得GIT?

时间:2009-07-01 18:11:56

标签: delphi com marshalling

我正在尝试使用以下代码(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;

但是,CoCreateInstance会抛出“未注册类”异常。事实上:在HKCR / CLSID中,没有{00000146-等}的条目。

要在注册表中获取此定义,应注册哪个dll或ocx? 或者我完全错了吗?

3 个答案:

答案 0 :(得分:7)

这是我的单位。当我在D2006编译时,我把它放在一起,但我不明白为什么它在D7中会有所不同。我用它来存储DCOM服务器的接口并在多个线程之间共享它。

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.

答案 1 :(得分:5)

您错误地定义了CLSID_StdGlobalInterfaceTable:您提供了接口的GUID而不是具体的类。

我没有Windows头文件,所以我无法检查它们,但搜索建议它应该是:

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

答案 2 :(得分:2)

您是否使用OleView32来验证类的GUID?该实用程序在Windows SDK中可用,并允许您比regedit更容易地遍历接口的注册表。我会将该实用程序归类为任何COM开发的必备条件。