Как получить GIT в Delphi 7?
-
21-08-2019 - |
Вопрос
Я пытаюсь получить таблицу глобального интерфейса, используя следующий код (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- etc.}.
Какая библиотека dll или ocx должна быть зарегистрирована, чтобы получить это определение в реестре?Или я делаю это совершенно неправильно?
Решение
Вот мое подразделение, которое это делает.Я собрал это вместе, когда компилировал в 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.
Другие советы
Вы неправильно определили CLSID_StdGlobalInterfaceTable:вы указали GUID интерфейса, а не конкретного класса.
У меня нет файлов заголовков Windows, поэтому я не могу свериться с ними, но поиск подсказывает, что это должно быть:
CLSID_StdGlobalInterfaceTable: TGUID = '{00000323-0000-0000-C000-000000000046}';
Вы использовали OleView32 для проверки GUID класса?Эта утилита доступна в Windows SDK и позволяет вам работать с реестром интерфейсов намного проще, чем regedit.Я бы классифицировал утилиту как обязательную для любой разработки COM.