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

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

Управление Excel через ProcessID


Krants ©   (2007-08-23 11:39:00) 

Можно ли подключится к Excel(им. ввиду позднее связывание) через его PID.

ЗЫ: через GetActiveOleObjectпроизводится подкл. только к ранее запущенному Excel.Application, а хочется выборочно...


Krants   (2007-08-23 12:39:00) [1]

Есть! Спасибо, очень пригодится.


Сергей М.   (2007-08-23 12:35:00) [2]

Тогда так:

function GetWorkbooks: TInterfaceList;
var
rot: IRunningObjectTable;
em: IEnumMoniker;
m: IMoniker;
bc: IBindCtx;
Fetched: longint;
obj: IUnknown;
const IID_Workbook: TGUID = '{000208DA-0000-0000-C000-000000000046}';
begin
Result := TInterfaceList.Create;
OleCheck(CreateBindCtx(0, bc));
OleCheck(GetRunningObjectTable(0, rot));
OleCheck(rot.EnumRunning(em));
OleCheck(em.Reset);
OleCheck(em.Next(1, m, @Fetched));
while Fetched=1 do
try
try
  OleCheck(m.BindToObject(bc, nil, IID_Workbook, obj));
  Result.Add(obj);
except
end;
finally
OleCheck(em.Next(1, m, @Fetched));
end;
end;


Krants   (2007-08-23 12:19:00) [3]


> Сергей М. ©   (23.08.07 12:12) [6]

тот-же:
{00024500-0000-0000-C000-000000000046}
{00024500-0000-0000-C000-000000000046}
GetExcelApps1.Count равен "0".


Сергей М.   (2007-08-23 12:15:00) [4]

В принципе тебе даже знать не нужно, каким экземпляром открыта нужная книга.

Список всех существующих объектов Excel.Workbook:

function GetExcelApps: TInterfaceList;
var
rot: IRunningObjectTable;
em: IEnumMoniker;
m: IMoniker;
bc: IBindCtx;
Fetched: longint;
obj: IUnknown;
IID_Workbook: TGUID;
begin
IID_ExcelApplication := ProgIdToClassId('Excel.Workbook');
Result := TInterfaceList.Create;
OleCheck(CreateBindCtx(0, bc));
OleCheck(GetRunningObjectTable(0, rot));
OleCheck(rot.EnumRunning(em));
OleCheck(em.Reset);
OleCheck(em.Next(1, m, @Fetched));
while Fetched=1 do
try
 try
   OleCheck(m.BindToObject(bc, nil, IID_Workbook, obj));
   Result.Add(obj);
 except
 end;
finally
 OleCheck(em.Next(1, m, @Fetched));
end;
end;


Сергей М.   (2007-08-23 12:12:00) [5]

function GetExcelApps: TInterfaceList;
var
rot: IRunningObjectTable;
em: IEnumMoniker;
m: IMoniker;
bc: IBindCtx;
Fetched: longint;
obj: IUnknown;
IID_ExcelApplication: TGUID;
begin
IID_ExcelApplication := ProgIdToClassId('Excel.Application');
Result := TInterfaceList.Create;
OleCheck(CreateBindCtx(0, bc));
OleCheck(GetRunningObjectTable(0, rot));
OleCheck(rot.EnumRunning(em));
OleCheck(em.Reset);
OleCheck(em.Next(1, m, @Fetched));
while Fetched=1 do
try
  try
    OleCheck(m.BindToObject(bc, nil, IID_ExcelAppluication, obj));
    Result.Add(obj);
  except
  end;
finally
  OleCheck(em.Next(1, m, @Fetched));
end;
end;


Сергей М.   (2007-08-23 12:10:00) [6]


> Krants ©   (23.08.07 12:07) [4]


Убедись, что CLSID = {00024500-0000-0000-C000-000000000046} у тебя в реестре соответствует именно объекту Excel.Application.

Если это не так, получи актуальный GUID с пом. ProgIdToClassId


Krants   (2007-08-23 12:07:00) [7]

что-то он глючный как-ой то...
celtFetched???, - поменял на Fetched
но все-же он не воркает(не находит ничего)...


Сергей М.   (2007-08-23 11:51:00) [8]

Пример демонстрирует получения списка интерфейсов всех существующих объектов класса Excel.Application:

function GetExcelApps: TInterfaceList;
var
 rot: IRunningObjectTable;
 em: IEnumMoniker;
 m: IMoniker;
 bc: IBindCtx;
 Fetched: longint;
 obj: IUnknown;
const
 IID_ExcelApplication: TGUID = '{00024500-0000-0000-C000-000000000046}';
begin
 Result := TInterfaceList.Create;
 OleCheck(CreateBindCtx(0, bc));
 OleCheck(GetRunningObjectTable(0, rot));
 OleCheck(rot.EnumRunning(em));
 OleCheck(em.Reset);
 OleCheck(em.Next(1, m, @celtFetched));
 while Fetched=1 do
 try
   try
     OleCheck(m.BindToObject(bc, nil, IID_ExcelAppluication, obj));
     Result.Add(obj);
   except
   end;
 finally
   OleCheck(em.Next(1, m, @Fetched));
 end;
end;


Krants   (2007-08-23 11:49:00) [9]

А как можно иначе?
Просто есть задача: запущенно несколько Excel.Application, в каждом запущенно несколько Workbooks и из этого набора нужно выбрать и обработать некоторый документ...


Сергей М.   (2007-08-23 11:43:00) [10]

А зачем нужен PID ?

ДЛя решения задачи он вовсе не обязателен.


Наверх

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