powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OLE(MS Excel), "Вызов был отклонен" во время диалога.
23 сообщений из 23, страница 1 из 1
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39888289
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Юзеру показываю документ в MS Excel, чтобы от поредактировал документ в temp - папке, сохранил результат и закрыл иксель.
Проверяя разные свойства, жду, пока юзер не перестанет редактировать файл. Если юзер закрыл книгу (или "сохранил как") - считается, что редактирование документа завершено. После этого, если файл исходный изменен, я это файл его использую дальше в соответствии с моими надобностями.

Свойство DisplayAlerts COM-объекта MSExcel не трогаю, так надо.
Поэтому, при попытке закрыть несохраненный документ, иксель показывает диалоговое окно "Ты забыл сохранить!".
Еще окно может быть показано, например, когда юзер жмет кнопку "сохранить как". Ну и при вызове разных настроек.
В момент показа модальных окон, иксель не отвечает на обращение к нему как к COM - серверу. Вернее, отвечает одинаково - исключение с сообщением "Вызов был отклонен".

Вопрос: как отловить ситуацию, что СОМ-сервер в данный момент не может работать как СОМ?
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39888290
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самая большая неприятность в том, что после такого исключения, повторное обращение к свойствам СОМ-сервера больше "не работает", всякий раз выбрасывается то же самое исключение, даже если причина устранена, т.е. модальное окно было закрыто.
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39888312
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть замечательное свойство Application.Ready : https://docs.microsoft.com/ru-ru/office/vba/api/excel.application.ready

Только и его вызывать во время диалогов нельзя... :(
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39888318
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Офигеть, в и-нте этот вопрос встречается массово - а решения нигде не нашел...

Я вот сейчас запустил активизировал документ в своем "самодельном" СОМ - сервере из своего же клиента, потом в сервере активизировал диалог "Сохранить как" и одновременно обратился из клиента к серверу - все нормально отработало. Без всяких проверок "Ready". Т.е., это "чисто офисный баг".
Ну как, как можно было так накосячить и за столько лет не исправить?
Жопой они, что ли этот офис пишут...
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39888321
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё
...
Юзеру показываю документ в MS Excel, чтобы от поредактировал документ в temp - папке, сохранил результат и закрыл иксель.
Проверяя разные свойства, жду, пока юзер не перестанет редактировать файл. Если юзер закрыл книгу (или "сохранил как") - считается, что редактирование документа завершено. После этого, если файл исходный изменен, я это файл его использую дальше в соответствии с моими надобностями...


Раз такие заморочки с СОМ, решил сделать иначе.
Тупо с помощью ShellExecuteEx открываю файл "чем бог пошлет", в соответствии с текущим зарегистрированным расширением (.xls -> MS Excel или MS Office и т.д.), и жду завершения порожденного процесса. Сравниваю время файла с сохраненным перед началом редактирования и принимаю решение, что с ним делать.
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39888336
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё
ёёёёё
...
Юзеру показываю документ в MS Excel, чтобы от поредактировал документ в temp - папке, сохранил результат и закрыл иксель.
Проверяя разные свойства, жду, пока юзер не перестанет редактировать файл. Если юзер закрыл книгу (или "сохранил как") - считается, что редактирование документа завершено. После этого, если файл исходный изменен, я это файл его использую дальше в соответствии с моими надобностями...


Раз такие заморочки с СОМ, решил сделать иначе.
Тупо с помощью ShellExecuteEx открываю файл "чем бог пошлет", в соответствии с текущим зарегистрированным расширением (.xls -> MS Excel или MS Office и т.д.), и жду завершения порожденного процесса. Сравниваю время файла с сохраненным перед началом редактирования и принимаю решение, что с ним делать.

Вот. Дом свободный живите кто хотите.
Может, кому понадобится такое счастье. Лишнее выкинул, то что осталось вроде должно работать.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
function FileExecuteWait(const aFileName: string; const
  aParams: string = ''; const aStartDir: string = ''; aInitialState: Integer =
  SW_NORMAL): Boolean;
var
  fInfo: TShellExecuteInfo;
begin
  FillChar(fInfo, SizeOf(fInfo), 0);
  fInfo.cbSize := SizeOf(TShellExecuteInfo);
  fInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
  fInfo.Wnd := 0; // Или, если нужно - Application.MainFormHandle; // Хэндл окна
  //Wnd := Application.MainFormHandle; // Хэндл окна
  fInfo.lpVerb := nil; //'runas';
  fInfo.lpFile := PChar(aFileName);
  fInfo.lpParameters := PChar(aParams);
  fInfo.lpDirectory := PChar(aStartDir);
  fInfo.nShow := aInitialState;
  Result := ShellExecuteEx(@fInfo);
  if not Result then Exit;

  WaitForInputIdle(fInfo.hProcess, INFINITE); // ждем завершения инициализации
//    Application.ProcessMessages;
  WaitForSingleObject(fInfo.hProcess, INFINITE);
//    WaitForSingleObject(fInfo.hProcess, INFINITE);
//    while WaitForSingleObject(fInfo.hProcess, 100) = WAIT_TIMEOUT do
//      Application.ProcessMessages;
// !ещё и девки, со своими хуками.
end;



Пример:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
const
  cFN = 'C:\123.xls';
begin
...
if not FileExecuteWait(cFN) then 
      raise Exception.CreateFmt('Не удалось запустить приложение для файла'
        + '"%s"', [cFN]);
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39888420
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно подписаться на события OnWorkbookBeforeSave или OnWorkbookBeforeClose.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
Fxls, Fwbk: OleVariant;

Fxls := CreateOleObject('Excel.Application');
Fwbk := Fxls.WorkBooks.Open(FFilePath, 0, True);
ExcelEvents1.ConnectToAppEvents(Fxls);
ExcelEvents1.ConnectToWorkBookEvents(Fwbk);

// при выходе

ExcelEvents1.DisconnectFromWorkBookEvents;
ExcelEvents1.DisconnectFromAppEvents;
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890297
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
istrebitel
Можно подписаться на события OnWorkbookBeforeSave или OnWorkbookBeforeClose.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
Fxls, Fwbk: OleVariant;

Fxls := CreateOleObject('Excel.Application');
Fwbk := Fxls.WorkBooks.Open(FFilePath, 0, True);
ExcelEvents1.ConnectToAppEvents(Fxls);
ExcelEvents1.ConnectToWorkBookEvents(Fwbk);

// при выходе

ExcelEvents1.DisconnectFromWorkBookEvents;
ExcelEvents1.DisconnectFromAppEvents;




https://www.sql.ru/forum/actualfile.aspx?id=22015020] Приложенный файл (ExcelEvents.zip - 15Kb)

Спасибо, примерно так и сделал (как положено, помудохавшись сперва , ага).
Только ч/з импортированную библиотеку типов икселя.
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890569
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
procedure FileExecuteWait(const aFileName: string; const
  aParams: string = ''; const aStartDir: string = ''; aInitialState: Integer =
  SW_NORMAL);


Код: pascal
1.
2.
3.
4.
5.
6.
7.
Win32Check(ShellExecuteEx(@fInfo));

//  WaitForInputIdle(fInfo.hProcess, INFINITE); // НЕ ждем завершения инициализации (а смысл?)
  Win32Check(WaitForSingleObject(fInfo.hProcess, INFINITE) <> WAIT_FAILED);
  CloseHandle(fInfo.hProcess);
// !ещё и девки, со своими хуками.
end;


ёёёёё
Пример:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
try
  FileExecuteWait(cFN);
except
  on E: Exception do
    raise Exception.CreateFmt(
      'Не удалось запустить приложение для файла "%s". Ошибка: %s'
      [cFN, E.Message]
    );
end;
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890591
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gunsmoker рекомендует ещё оборачивать вызов ShellExecuteEx() в
CoInitializeEx() + CoUninitialize
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890618
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890631
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
оборачивать вызов ShellExecuteEx() в CoInitializeEx() + CoUninitialize
основной VCL поток уже обернут сам
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890633
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18.11.2019 16:29, _Vasilisk_ пишет:
> основной VCL поток уже обернут сам

а вдрук он консольку пишет?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890635
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
а вдрук он консольку пишет?
Тогда получит ошибку
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890656
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18.11.2019 16:32, _Vasilisk_ пишет:
> Тогда получит ошибку

где?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890659
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появилось доп. условие - "откреплять" MS Excel в случае, если оператор по SaveAs выполнил сохранение в другое место.

Загружает икселевский файл во временную директорию, запускает иксель, по завершению результат можно куда-то использовать (надо только дождаться "освобождения" файла). Вот получившийся монстрик:
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890663
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18.11.2019 16:53, ёёёёё пишет:
> Вот получившийся монстрик:

архивы никто не читает
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890671
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
> Тогда получит ошибку
где?
здесь
_Vasilisk_
Код: pascal
1.
Win32Check(ShellExecuteEx(@fInfo));

...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890680
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18.11.2019 17:01, _Vasilisk_ пишет:
>
> здесь
> Win32Check(ShellExecuteEx(@fInfo));

из-за почему?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890742
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
из-за почему?
Из-за какого нибудь CO_E_NOTINITIALIZED.

И кстати
MSDNThere are instances where ShellExecuteEx does not use one of these types of Shell extension and those instances would not require COM to be initialized at all. Nonetheless, it is good practice to always initalize COM before using this function.Т.е. это всего лишь good practice, а не обязаловка
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890749
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18.11.2019 18:20, _Vasilisk_ пишет:
> Из-за какого нибудь CO_E_NOTINITIALIZED.

дык это ж всё проверяется по результату инициализации
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39890755
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
дык это ж всё проверяется по результату инициализации
Нет. Эта ошибка возникает уже в момент вызова COM
...
Рейтинг: 0 / 0
OLE(MS Excel), "Вызов был отклонен" во время диалога.
    #39891824
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Код: pascal
1.
2.
3.
procedure FileExecuteWait(const aFileName: string; const
  aParams: string = ''; const aStartDir: string = ''; aInitialState: Integer =
  SW_NORMAL);



Код: pascal
1.
2.
3.
4.
5.
6.
7.
Win32Check(ShellExecuteEx(@fInfo));

//  WaitForInputIdle(fInfo.hProcess, INFINITE); // НЕ ждем завершения инициализации (а смысл?)
  Win32Check(WaitForSingleObject(fInfo.hProcess, INFINITE) <> WAIT_FAILED);
  CloseHandle(fInfo.hProcess);
// !ещё и девки, со своими хуками.
end;



ёёёёё
Пример:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
try
  FileExecuteWait(cFN);
except
  on E: Exception do
    raise Exception.CreateFmt(
      'Не удалось запустить приложение для файла "%s". Ошибка: %s'
      [cFN, E.Message]
    );
end;



Иксель запросто прекращает работу запущенного процесса, передав параметр в другой экземпляр процесса.
Пример. Открываем MS Excel (2003 - у меня), запускается с пустым листом (табличка, пока без данных). Если ничего не менять в листе и не загружать внешний файл, то запуск указанным методом еще одного экземпляра приводит к тому, что запущенный экземпляр закрывается, а в ранее запущенном "пустом" экземпляре оказывается открыт файл, переданный как параметр.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OLE(MS Excel), "Вызов был отклонен" во время диалога.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]