Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > ShellExecute Как отловить его ошибки?


Автор: brick-rs 28.7.2004, 03:08
Подскажите плиз, использую ShellExecute для открытия разных доков, и т.п... Вопрос встал как отловить его ошибки? причем как таковыми ошибками они не вываливаааются, но если при открытии дока что то у него не получилось то он просто молчит, если все нормально то он открывает все Ок. На предмет существования дока проверку делаю.
Для инфо: Делфи 6, конкретно интересует случай с открытием скажем дока на кт не установленно соответствующее приложение?
использую такой код:
pt:=StrPCopy(zFileName,Grid1.DataSource.DataSet.FieldByName('pathorig').AsString);
if not FileExists(pt) then showmessage('Документ по либо отсутствует, либо перемещен.')
else ShellExecute(Handle, 'open',pt,nil,nil, SW_SHOWNORMAL);

Автор: Cashey 28.7.2004, 06:59
Функция возвращает дескриптор открытого приложения. Если возвращаемое значение меньше или равно 32, это указывает на ошибку. Для Windows старше 95-го эти константы означают:
0 Системе не хватает памяти, выполняемый файл испорчен или произошло ошибочное перераспределение памяти.
2 Файл не найден.
3 Путь не найден.
5 Была попытка динамически связаться с задачей, была ошибка многопроцессорного выполнения или ошибка защиты сети.
6 Библиотека требует отдельных сегментов данных для каждой задачи.
8 Недостаточно памяти для запуска приложения.
10 Ошибочная версия Windows.
11 Ошибочный выполняемый файл. Или это не приложение Windows, или ошибка в .exe файле.
12 Приложение спроектировано для другой операционной системы.
13 Приложение спроектировано для MS-DOS 4.0.
14 Неизвестный тип выполняемого файла.
15 Попытка запустить приложение, работающее только на более ранних версиях Windows.
16 Попытка запустить второй экземпляр приложения, содержащего сегменты данных, не помеченные "только для чтения".
19 Попытка запустить архивированный файл. Файл должен быть разархивирован, прежде чем его можно будет загрузить.
20 Ошибочный файл одной из DLL, требуемой для приложения.
21 Приложение требует 32-битного расширения Windows.
31 Нет приложения, связанного с файлом указанного типа, или нет файла, связанного с указанной операцией.

Автор: brick-rs 28.7.2004, 08:04
а вот собственно в том то и весь вопрос как этот дескриптор проверить? не знаю еще не разу не сталкивался
sample.gif плиз можно в кратце

Автор: <Spawn> 28.7.2004, 11:00
brick-rs Все просто:

Код
procedure TForm1.Button1Click(Sender: TObject);
var
 ExecResult: THandle;
begin
 ExecResult := ShellExecute(Handle, 'open', 'E:\Test.txt', nil, nil, SW_SHOWNORMAL);
 if ExecResult < HINSTANCE_ERROR then
   case ExecResult of
     0:
       ShowMessage('The operating system is out of memory or resources.');
     ERROR_FILE_NOT_FOUND:
       ShowMessage('The specified file was not found.');
     ERROR_PATH_NOT_FOUND:
       ShowMessage('The specified path was not found.');
     ERROR_BAD_FORMAT:
       ShowMessage('The .EXE file is invalid (non-Win32 .EXE or error in .EXE image).');
     <и т.д.>
   end;
end;

Все константы есть в хелпе

Автор: Vit 28.7.2004, 20:54
Используй CreateProcess - гораздо больше возможностей, и по отлову ошибок в том числе...

Автор: saw666 15.10.2016, 09:51
Цитата(Cashey @ 28.7.2004,  06:59)
Для Windows старше 95-го эти константы означают:
0    Системе не хватает памяти, выполняемый файл испорчен или произошло ошибочное перераспределение памяти. 
2  Файл не найден. 
3  Путь не найден.
5    Была попытка динамически связаться с задачей, была ошибка многопроцессорного выполнения или ошибка защиты сети. 
6    Библиотека требует отдельных сегментов данных для каждой задачи. 
8    Недостаточно памяти для запуска приложения. 
10    Ошибочная версия Windows. 
11    Ошибочный выполняемый файл. Или это не приложение Windows, или ошибка в .exe файле. 
12    Приложение спроектировано для другой операционной системы. 
13    Приложение спроектировано для MS-DOS 4.0. 
14    Неизвестный тип выполняемого файла. 
15    Попытка запустить приложение, работающее только на более ранних версиях Windows. 
16    Попытка запустить второй экземпляр приложения, содержащего сегменты данных, не помеченные "только для чтения". 
19    Попытка запустить архивированный файл. Файл должен быть разархивирован, прежде чем его можно будет загрузить. 
20    Ошибочный файл одной из DLL, требуемой для приложения. 
21    Приложение требует 32-битного расширения Windows. 
31    Нет приложения, связанного с файлом указанного типа, или нет файла, связанного с указанной операцией.

Специально зарегистрировался чтобы поблагодарить за это сообщение. Да, даже в 2016 году оно оказалось полезным. Спасибо! )))

Автор: navodri 24.5.2018, 10:24
Вот так просто:

Код

if ShellExecute(Handle, 'open', 'E:\Test.txt', nil, nil, SW_SHOW) < 32 then
           MessageBox(Handle, 'Невозможно выполнить ShellExecute!', Ошибка открытия', MB_OK);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)