Зубр, не за что... Сделать-то то что хотел так и не получилось. Код раздобыл, вроде все понял, а как дошло до реализации, так тупик.
Ситуация такая приведенный выше код выводит список СОМ-серверов, точнее нечто вроде процессов, не знаю как еще сказать. Если бы не фильтрация в коде по признаку наличия CLSID - выдавал бы все задачи в панели задач, точнее их названия.
Ну ладно, выдал он мне что у меня запущено 2 экземпляра нужного мне сервера. Встает вопрос как определить какой мне нужен? Критерий есть Хэндл окна. Метод такой у сервера есть - за чем дело встало? А дело встало за тем, что у меня есть только IMoniker объекта и ROT. Но у ROT-а есть метод GetObject, который по указанному IMoniker-у возвращает интерфейс.
var intf:IInterface;
ac:IAcadApplication;//Мой искомый интерфейс
...
while penum.Next(1,pmon,nil)=s_ok do begin
CreateBindCtx(0, pibc);
pmon.GetDisplayName(pibc,pmon,name);
start:=Pos('{', AnsiString(name));
if start>0 then begin
//NEW Если у нас CLSID
if pirot.GetObject(pmon,intf)=s_ok then begin//Получаем интерфейс Моникера
if intf.QueryInterface(IID_AcadApplication, ac)=E_NoInterface{??не помню константу} then
h:=-1;
else//"Наш человек", в смысле интерфейс
h:=ac.activedocument.hwnd;
//Выводим хэндлы объектов наших интерфейсов
ListBox1.items.add(inttostr(h));
end;
//END NEW
len:= Pos('}', AnsiString(name))-start;
SrvList.Items.Add(copy (AnsiString(name), start,len+1));
end;
CoTaskMemFree(name);
...
После выполнения я вижу, что Хэндлы у всех одинаковые. И тут до меня доходит, что я ничерта не понимаю в интерфейсах и СОМ.
Интерфейс просто описание, внешняя связка, методы какого-то объекта. Получается у меня один интерфейс на несколько объектов, что верно. Но Моникеры-то разные должны быть, раз объекты разные. Но интерфейс у них один.
Сейчас будет глупый вопрос!
Связан интерфейс с конкретным объектом?
И вообще можно как-то связать интерфейс с объектом?
И вообще объясните мне в чем здесь дело?
П.С. Есть куча различной информации и статей о интерфейсах, СОМ, но этого я как-то не встречал.