Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

COM и IGlobalInterfaceTable [D5, D6, NT4]


doublebug ©   (2002-11-15 12:11:00) 

Привет всем
Кто-нить использовал IGlobalInterfaceTable интерфейс
в дельфях или это прерогатива VC ?
Ну или наводочку как это дело заюзать ?


doublebug   (2002-11-17 14:45:00) [1]

Сорри за пред пост вот код который прошел стресс тест


unit GIT;

interface

uses SysUtils, Windows;

const

IID_IGlobalInterfaceTable: TGUID = "{00000146-0000-0000-C000-000000000046}";
CLSID_StdGlobalInterfaceTable: TGUID = "{00000323-0000-0000-C000-000000000046}";

type

EGITExeption = class(Exception);

IGlobalInterfaceTable = interface(IUnknown)
["{00000146-0000-0000-C000-000000000046}"]
function RegisterInterfaceInGlobal(const pUnk: IUnknown; const riid: TGUID;
out dwCookie: DWORD): HResult; stdcall;
function RevokeInterfaceFromGlobal(dwCookie: DWORD): HResult; stdcall;
function GetInterfaceFromGlobal(dwCookie: DWORD; const riid: TGUID;
out ppv): HResult; stdcall;
end;

{Add interface pointer to GIT and cookie for it}
function RegisterInterfaceInGlobal(const pUnk: IUnknown; riid: TGUID): DWORD;
procedure RevokeInterfaceFromGlobal(dwCookie: DWORD);
function GetInterfaceFromGlobal(dwCookie: DWORD; const riid: TGUID): IUnknown;

implementation

uses ActiveX;


//initializes GIT in every apartment;
function CheckGIT: IGlobalInterfaceTable;
begin
Result := nil;
CoCreateInstance(CLSID_StdGlobalInterfaceTable,
nil,
CLSCTX_INPROC_SERVER,
IID_IGlobalInterfaceTable,
Result);

if Result = nil then
raise EGITExeption.Create("GIT initialization failed");
end;

function RegisterInterfaceInGlobal(const pUnk: IUnknown; riid: TGUID): DWORD;
begin
CheckGIT.RegisterInterfaceInGlobal(pUnk, riid, Result);
end;

procedure RevokeInterfaceFromGlobal(dwCookie: DWORD);
begin
CheckGIT.RevokeInterfaceFromGlobal(dwCookie);
end;

function GetInterfaceFromGlobal(dwCookie: DWORD; const riid: TIID): IUnknown;
begin
CheckGIT.GetInterfaceFromGlobal(dwCookie,riid,Result);
end;

end.


doublebug   (2002-11-16 16:48:00) [2]

Вот может кому понадобится
модуль для работы с GlobalInterfaceTable


unit GIT;

interface

uses SysUtils, Windows;

const

IID_IGlobalInterfaceTable: TGUID = "{00000146-0000-0000-C000-000000000046}";
CLSID_StdGlobalInterfaceTable: TGUID = "{00000323-0000-0000-C000-000000000046}";

type

EGITExeption = class(Exception);

IGlobalInterfaceTable = interface(IUnknown)
["{00000146-0000-0000-C000-000000000046}"]
function RegisterInterfaceInGlobal(const pUnk: IUnknown; const riid: TGUID;
out dwCookie: DWORD): HResult; stdcall;
function RevokeInterfaceFromGlobal(dwCookie: DWORD): HResult; stdcall;
function GetInterfaceFromGlobal(dwCookie: DWORD; const riid: TGUID;
out ppv): HResult; stdcall;
end;

{Add interface pointer to GIT and cookie for it}
function RegisterInterfaceInGlobal(const pUnk: IUnknown; riid: TGUID): DWORD;
procedure RevokeInterfaceFromGlobal(dwCookie: DWORD);
function GetInterfaceFromGlobal(dwCookie: DWORD; const riid: TGUID): IUnknown;

implementation

uses ActiveX;

var
gGIT : IGlobalInterfaceTable;

procedure CheckGIT;
begin
if gGIT = nil then
raise EGITExeption.Create("GIT initialization failed");
end;

function RegisterInterfaceInGlobal(const pUnk: IUnknown; riid: TGUID): DWORD;
begin
CheckGIT;
gGIT.RegisterInterfaceInGlobal(pUnk, riid, Result);
end;

procedure RevokeInterfaceFromGlobal(dwCookie: DWORD);
begin
CheckGIT;
gGIT.RevokeInterfaceFromGlobal(dwCookie);
end;

function GetInterfaceFromGlobal(dwCookie: DWORD; const riid: TIID): IUnknown;
begin
CheckGIT;
gGIT.GetInterfaceFromGlobal(dwCookie,riid,Result);
end;

initialization
gGIT := nil;
CoCreateInstance(CLSID_StdGlobalInterfaceTable,
nil,
CLSCTX_INPROC_SERVER,
IID_IGlobalInterfaceTable,
gGIT);
finalization
if gGIT <> nil then
gGIT._Release;
end.


doublebug   (2002-11-15 17:04:00) [3]

пул указателей на интерфейсы доступный из нескольких апартаментов


Skier   (2002-11-15 12:15:00) [4]

>doublebug
Что хочешь сделать ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо