Вопрос по – Как получить GIT в Delphi 7?

4

Я пытаюсь получить таблицу глобальных интерфейсов, используя следующий код (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 = & apos; {00000323-0000-0000-C000-000000000046} & ap; Спасибо обоим комментаторам за предоставленный ответ. Rocky Luck

Ваш Ответ

3   ответа
5

вы указали GUID интерфейса, а не конкретный класс.

У меня нет заголовочных файлов Windows, поэтому я не могу проверить их, но поиск показывает, что это должно быть:

 CLSID_StdGlobalInterfaceTable: TGUID = '{00000323-0000-0000-C000-000000000046}';
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Rocky Luck
Error: User Rate Limit Exceeded Rocky Luck
Error: User Rate Limit Exceeded Rocky Luck
Error: User Rate Limit Exceeded Rocky Luck
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.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Rocky Luck
Error: User Rate Limit Exceeded
2

тупна в Windows SDK и позволяет вам обходить реестр интерфейсов намного проще, чем regedit. Я бы классифицировал утилиту как обязательную для любой разработки COM.

Error: User Rate Limit Exceeded Rocky Luck
Error: User Rate Limit Exceeded

Похожие вопросы