Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.11;
Скачать: CL | DM;

Вниз

Управление Excel через ProcessID   Найти похожие ветки 

 
Krants ©   (2007-08-23 11:39) [0]

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

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


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

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

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


 
Krants ©   (2007-08-23 11:49) [2]

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


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

Пример демонстрирует получения списка интерфейсов всех существующих объектов класса 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 12:07) [4]

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


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


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


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

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


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

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:15) [7]

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

Список всех существующих объектов 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;


 
Krants ©   (2007-08-23 12:19) [8]


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

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


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

Тогда так:

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:39) [10]

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



Страницы: 1 вся ветка

Текущий архив: 2007.11.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
3-1183454899
Prohodil Mimo
2007-07-03 13:28
2007.11.11
Можно ли в FB 2 хранить картинки в отдельном файле?


9-1162828267
Алена
2006-11-06 18:51
2007.11.11
OpenGl


2-1192781260
Abcdef123
2007-10-19 12:07
2007.11.11
Как грамотрее написать вот такой код


4-1177584855
Iv_
2007-04-26 14:54
2007.11.11
Кнопка- Bitmap на WinAPI


2-1192444473
ALSHTAM
2007-10-15 14:34
2007.11.11
вопрос по firebird