Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2019, 12:26   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию [Delphi] Не могу поймать исключение ShellExecuteEx

Доброе время суток форумчане
Была и есть у меня библиотека, только с некоторых пор у меня стала через раз работать функция «ShellExecute» (раз, 2, 3 откроет word файл, и все, далее программа файл создает, но не открывает (файл word – корректный, к тому же создает один и тот же файл по одному алгоритму)),
Заменил ее на «ShellExecuteEx»

Код:
function LAUNCH_FILE(const AFileName: string): Boolean;
var
  ShellExecuteInfo: TShellExecuteInfo;
  LExtension: PAnsiChar;
begin
  begin
    FillChar(ShellExecuteInfo, SizeOf(ShellExecuteInfo), 0);
    ShellExecuteInfo.fMask := SEE_MASK_CLASSNAME;
    ShellExecuteInfo.nShow := SW_MAXIMIZE;
    ShellExecuteInfo.lpClass := PChar(AFileName);

    ShellExecuteInfo.Wnd := FMain.Handle;

    ShellExecuteInfo.lpVerb := 'open';
    ShellExecuteInfo.lpFile := PChar(AFileName);
    ShellExecuteInfo.cbSize := SizeOf(ShellExecuteInfo);
    if not ShellExecuteEx(@ShellExecuteInfo)  then
    begin
       ShowMessage('bad');
      case ShellExecuteInfo.hInstApp of
        SE_ERR_FNF: ShowMessage('Файл не найден');
        SE_ERR_PNF: ShowMessage('Путь не найден');
        SE_ERR_ACCESSDENIED: ShowMessage('Доступ к файлу запрещен');
        SE_ERR_OOM: ShowMessage('He хватает памяти');
        SE_ERR_DLLNOTFOUND: ShowMessage('Не найдена необходимая DLL');
        SE_ERR_SHARE: ShowMessage( '-Файл занят другим пользователем');
        SE_ERR_ASSOCINCOMPLETE: ShowMessage('Не полная информация о связанном с файлом приложении');
        SE_ERR_DDETIMEOUT: ShowMessage('Истекло время на выполнение операции DDE');
        SE_ERR_DDEFAIL: ShowMessage('Ошибочная операция DDE');
        SE_ERR_DDEBUSY: ShowMessage('Операция DDE занята');
        SE_ERR_NOASSOC: ShowMessage('Нет приложения, связанного с файлом');
      end

    end
    else ShowMessage('All right');
  end;
end;
Та же самая фигня, но теперь, даже если файл и не открывает, всеравно выдает мое сообщение «('All right')»., т.е. она вообще в блок «исключений» не входит.
Не открывает на Windows XP.
Delphi 10.2 у меня Windows 10.

В чем может быть причина?

Заранее спасибо за ответ.
KBO вне форума Ответить с цитированием
Старый 08.02.2019, 12:36   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

GetLastError
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.02.2019, 12:55   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

тогда это будет выглядеть вот так:

Код:
if not ShellExecuteEx(@ShellExecuteInfo) then
    begin
      Application.MessageBox(PChar(SysErrorMessage(GetLastError)), 'Ошибка', MB_OK or MB_ICONERROR);
      Exit;
    end;
но в предыдущем моем коде был точно такой же "if", и что-то "ShowMessage('bad');" - не срабатывало, а оно по любому должно было сработать, все время срабатывало "ShowMessage('All right');"

А можно вообще нверно сделать
Код:
if Win32Check(ShellExecuteEx(@ShellExecuteInfo)) then
Application.MessageBox(PChar(SysErrorMessage(GetLastError)), 'Ошибка', MB_OK or MB_ICONERROR);
      Exit;
    end;

Последний раз редактировалось KBO; 08.02.2019 в 13:02.
KBO вне форума Ответить с цитированием
Старый 08.02.2019, 19:31   #4
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

кажется нашел проблему: у меня функция сохраняющий документ

Код:
function SaveDocAs(ANamePath, ANameFile: string; AOpenDoc: integer):boolean; export;
//save created doc
{
LOpenDoc
  0 - not open created doc
  1 - open created doc
}
var
  LPath: string;
begin
  SaveDocAs := true;
  try
    begin
      Words_Templs.ActiveDocument.SaveAs(ANamePath+VERIFICATION_NAME_FILE(ANameFile));
      CloseDoc;
      Close_Document(0);
      Words_Templs := Unassigned;
      CoUninitialize;
      if AOpenDoc = 1 then
        OPEN_MAKE_DOC(ANamePath, VERIFICATION_NAME_FILE(ANameFile), '', 0, LPath);

    end;
  except
    SaveDocAs := false;
  end;
end;
строки разрушаюшие объект

Код:
  Words_Templs := Unassigned;
  CoUninitialize;
были после "
Код:
if AOpenDoc = 1 then
", которые его открывают. т.е. пытался открыть не разрушенный объект

только 10 это как-то обрабатывала, а ХР - отказывалась
Во всяком случае после этой замены, все пока открывается без проблем
KBO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование ShellExecuteEx D6ist Общие вопросы Delphi 1 26.11.2017 23:34
ShellExecuteEx Chugun Общие вопросы Delphi 2 12.12.2013 19:38
Explorer.exe Исключение неизвестное программное исключение Windows XP, что делать? Igorilla Windows 6 02.04.2013 22:49
ShellExecuteEx Neobrat Общие вопросы Delphi 6 09.09.2010 15:10
Не могу обработать исключение CrazyXaoc C++ Builder 10 17.02.2010 14:56