【问题标题】:How to get the GIT in Delphi 7?如何在 Delphi 7 中获取 GIT?
【发布时间】:2010-11-07 10:05:20
【问题描述】:

我正在尝试使用以下代码 (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,以便在注册表中获取此定义? 还是我做错了?

【问题讨论】:

  • 此功能有效,前提是您使用此功能:TGUID = '{00000323-0000-0000-C000-000000000046}' 感谢两位评论者提供此答案。

标签: delphi com marshalling


【解决方案1】:

这是我的单位。我在 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.

【讨论】:

  • 这太棒了。我认为 ClassID 也必须在注册表中找到。但事实并非如此!去搞清楚。谢谢你的回答!!
  • 不客气。老实说,我想你就快到了。与其分析每个人发布的所有不同的位,我只是想我会发布我知道有效的很多。 ;-)
【解决方案2】:

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

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

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

【讨论】:

  • 这是来自 ActiveX.pas(delphi 源)的定义: {$EXTERNALSYM IGlobalInterfaceTable} IGlobalInterfaceTable = interface(IUnknown) ['{00000146-0000-0000-C000-000000000046}'] function RegisterInterfaceInGlobal(常量 pUnk:IUnknown;常量 riid:TIID;出 dwCookie:DWORD):HResult;标准调用;函数 RevokeInterfaceFromGlobal(dwCookie: DWORD): HResult;标准调用;函数 GetInterfaceFromGlobal(dwCookie: DWORD; const riid: TIID; out ppv): HResult;标准调用;结尾; 00000323 不在注册表中
  • Rocky,ActiveX.pas 给出了接口的 IID,而不是实现接口的类的 CLSID。您错误地定义了 CLSID 常量。除此之外,您的代码没有任何问题。
  • 我之前的评论不是很清楚。最后一句应为:{00000323- etc. } 也不在注册表中。
  • 感谢您的回答,罗布。代码来源于我在互联网上找到的一个通用库。所以,这也是错误的。但是我仍然没有在注册表中找到 GlobalInterfaceTable classID。
【解决方案3】:

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

【讨论】:

  • 我不知道这个实用程序。现在对于 100000 美元的问题:我应该使用这个实用程序寻找哪个类。或者我应该如何搜索 IGlobalInterfaceTable 类?
  • 你可以搜索接口,我相信一旦你选择了一个,你就可以选择它来挖掘谁实现了该接口的列表。不幸的是,我在这台机器上没有它(目前没有做任何 com 工作),但它确实有助于追踪诸如哪些 DLL 注册了接口、可用的方法以及遍历继承链的能力。跨度>
猜你喜欢
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多