powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не могу поймать исключение ShellExecuteEx
9 сообщений из 9, страница 1 из 1
Не могу поймать исключение ShellExecuteEx
    #39771083
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток форумчане
Была и есть у меня библиотека, только с некоторых пор у меня стала через раз работать функция « ShellExecute » (раз, 2, 3 откроет word файл, и все, далее программа файл создает, но не открывает (файл word – корректный, к тому же создает один и тот же файл по одному алгоритму)),
Заменил ее на « ShellExecuteEx »

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
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');
         Application.MessageBox(PChar(SysErrorMessage(GetLastError)), 'Ошибка', MB_OK or MB_ICONERROR);
      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.

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

Заранее спасибо за ответ.
...
Рейтинг: 0 / 0
Не могу поймать исключение ShellExecuteEx
    #39771089
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey-2008В чем может быть причина?

Ну, например, в том, что ты говоришь "используй класс", а суёшь туда имя файла вместо
гуида класса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не могу поймать исключение ShellExecuteEx
    #39771091
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Не могу поймать исключение ShellExecuteEx
    #39771198
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey-2008,

и еще. Перед 'All right' неплохо бы закрывать хэндл процесса.
CloseHandle( ShellExecuteInfo.hProcess );
...
Рейтинг: 0 / 0
Не могу поймать исключение ShellExecuteEx
    #39771238
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, у него нет SEE_MASK_NOCLOSEPROCESS.
...
Рейтинг: 0 / 0
Не могу поймать исключение ShellExecuteEx
    #39771304
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmokerYuRock, у него нет SEE_MASK_NOCLOSEPROCESS.А, да, тогда не надо
...
Рейтинг: 0 / 0
Не могу поймать исключение ShellExecuteEx
    #39771309
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня создает, заполняет, сохраняет файл и потом его открывает dll.

когда я вынес функцию открывания в отдельный файл (я немного переделал функцию открытия в плане "SEE_MASK_NOCLOSEPROCESS" и по совету 'YuRock' сделал "CloseHandle(ShellExecuteInfo.hProcess);")

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
procedure TForm2.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
  LAUNCH_FILE(OpenDialog1.FileName);
end;

function TForm2.LAUNCH_FILE(const AFileName: string): Boolean;

var
  ShellExecuteInfo: TShellExecuteInfo;
  LExtension: PAnsiChar;
begin
  begin
    FillChar(ShellExecuteInfo, SizeOf(TShellExecuteInfo), 0);
    ShellExecuteInfo.fMask := SEE_MASK_NOCLOSEPROCESS;

    ShellExecuteInfo.nShow := SW_MAXIMIZE;

    ShellExecuteInfo.Wnd := Application.Handle;

    ShellExecuteInfo.lpVerb := 'open';
    ShellExecuteInfo.lpFile := PChar(AFileName);
    ShellExecuteInfo.cbSize := SizeOf(ShellExecuteInfo);
    if not ShellExecuteEx(@ShellExecuteInfo) then
    begin
       ShowMessage('bad');
       Application.MessageBox(PChar(SysErrorMessage(GetLastError)), 'Ошибка', MB_OK or MB_ICONERROR);

      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
    begin
      CloseHandle(ShellExecuteInfo.hProcess);
      ShowMessage('All right2 =   '+AFileName);
    end;
  end;
end;



и просто открывал файлы которые создала моя dll - ВСЕ ПРЕКРАСНО РАБОТАЕТ, без всяких не открываний
...
Рейтинг: 0 / 0
Не могу поймать исключение ShellExecuteEx
    #39771321
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и такая фигня, только на windows XP
...
Рейтинг: 0 / 0
Не могу поймать исключение ShellExecuteEx
    #39771336
Sergey-2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
УРА!!!! Нашел..

оказалось в функции (которая сохраняет документ):

Код: 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.
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;



строки разрушаюшие объект

Код: pascal
1.
2.
      Words_Templs := Unassigned;
      CoUninitialize;



были после " if AOpenDoc = 1 then "
т.е. пытался открыть не разрушенный объект

только 10 это как-то обрабатывала, а ХР - отказывалась
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не могу поймать исключение ShellExecuteEx
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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