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

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

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

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

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


Раз такие заморочки с СОМ, решил сделать иначе.
Тупо с помощью ShellExecuteEx открываю файл "чем бог пошлет", в соответствии с текущим зарегистрированным расширением (.xls -> MS Excel или MS Office и т.д.), и жду завершения порожденного процесса. Сравниваю время файла с сохраненным перед началом редактирования и принимаю решение, что с ним делать.
...
Рейтинг: 0 / 0
13.11.2019, 00:42
    #39888336
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE(MS Excel), "Вызов был отклонен" во время диалога.
ёёёёё
ёёёёё
...
Юзеру показываю документ в 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
13.11.2019, 09:45
    #39888420
istrebitel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE(MS Excel), "Вызов был отклонен" во время диалога.
Можно подписаться на события 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
18.11.2019, 09:05
    #39890297
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE(MS Excel), "Вызов был отклонен" во время диалога.
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
18.11.2019, 15:24
    #39890569
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE(MS Excel), "Вызов был отклонен" во время диалога.
Код: 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
18.11.2019, 15:49
    #39890591
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE(MS Excel), "Вызов был отклонен" во время диалога.
gunsmoker рекомендует ещё оборачивать вызов ShellExecuteEx() в
CoInitializeEx() + CoUninitialize
...
Рейтинг: 0 / 0
18.11.2019, 16:20
    #39890618
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE(MS Excel), "Вызов был отклонен" во время диалога.
...
Рейтинг: 0 / 0
18.11.2019, 16:29
    #39890631
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE(MS Excel), "Вызов был отклонен" во время диалога.
Мимопроходящий
оборачивать вызов ShellExecuteEx() в CoInitializeEx() + CoUninitialize
основной VCL поток уже обернут сам
...
Рейтинг: 0 / 0
18.11.2019, 16:30
    #39890633
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE(MS Excel), "Вызов был отклонен" во время диалога.
18.11.2019 16:29, _Vasilisk_ пишет:
> основной VCL поток уже обернут сам

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

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

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

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

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

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

дык это ж всё проверяется по результату инициализации
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.11.2019, 18:38
    #39890755
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE(MS Excel), "Вызов был отклонен" во время диалога.
Мимопроходящий
дык это ж всё проверяется по результату инициализации
Нет. Эта ошибка возникает уже в момент вызова COM
...
Рейтинг: 0 / 0
20.11.2019, 16:25
    #39891824
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OLE(MS Excel), "Вызов был отклонен" во время диалога.
_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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / OLE(MS Excel), "Вызов был отклонен" во время диалога. / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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