![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Управление 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 ?
ДЛя решения задачи он вовсе не обязателен.