Delphi shellexecute коды ошибок


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

Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> ShellExecute Как отловить его ошибки? 

:(

   

Опции темы

brick-rs
Дата 28.7.2004, 03:08 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 11
Регистрация: 19.5.2004
Где: г. Мыски, Кемеров ская обл.

Репутация: нет
Всего: нет

Подскажите плиз, использую 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);

Это сообщение отредактировал(а) brick-rs — 28.7.2004, 03:10

PM MAIL WWW ICQ   Вверх
Cashey
Дата 28.7.2004, 06:59 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бессмертный
****

Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60

Функция возвращает дескриптор открытого приложения. Если возвращаемое значение меньше или равно 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 Нет приложения, связанного с файлом указанного типа, или нет файла, связанного с указанной операцией.

———————

библия учит любить ближнего, а камасутра обучает как именно

PM Jabber   Вверх
brick-rs
Дата 28.7.2004, 08:04 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 11
Регистрация: 19.5.2004
Где: г. Мыски, Кемеров ская обл.

Репутация: нет
Всего: нет

а вот собственно в том то и весь вопрос как этот дескриптор проверить? не знаю еще не разу не сталкивался
sample.gif плиз можно в кратце

PM MAIL WWW ICQ   Вверх
<Spawn>
Дата 28.7.2004, 11:00 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Око кары:)
****

Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64

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;

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

———————

«Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать» — Николай Безруков.

PM MAIL ICQ   Вверх
Vit
Дата 28.7.2004, 20:54 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Vitaly Nevzorov
****

Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 1
Всего: 207

Используй CreateProcess — гораздо больше возможностей, и по отлову ошибок в том числе…

———————

With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru

PM MAIL WWW ICQ   Вверх
saw666
Дата 15.10.2016, 09:51 (ссылка)
 | (голосов:1)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 1
Регистрация: 15.10.2016

Репутация: нет
Всего: нет

Цитата(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 году оно оказалось полезным. Спасибо! )))

PM MAIL   Вверх
navodri
Дата 24.5.2018, 10:24 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 173
Регистрация: 26.10.2007

Репутация: нет
Всего: -1

Вот так просто:

Код

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

PM MAIL WWW   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: WinAPI и системное программирование»
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »

I’m getting the return value when I call ShellExecute — an integer. Where can I get the associated error messages? I know they’re general, but I’ve seen messages in the MS documentation.

asked Feb 23, 2013 at 15:25

Patrick Moloney's user avatar

2

The error handling for ShellExecute is something of a disaster. Raymond Chen discusses it here: Why does ShellExecute return SE_ERR_ACCESSDENIED for nearly everything? So, even if you can convert the handful of possible ShellExecute errors into text, you’ll find that you invariably get Access denied. And that’s not very helpful.

The bottom line is that if you want real error reporting then you need to use ShellExecuteEx. If that fails you call GetLastError to get the Win32 error. To turn it into an exception with the descriptive text, call RaiseLastOSError. If you just want the descriptive text associated with an error, you call SysErrorMessage.

Fred vdP's user avatar

answered Feb 23, 2013 at 15:32

David Heffernan's user avatar

David HeffernanDavid Heffernan

599k42 gold badges1064 silver badges1481 bronze badges

WinApi Функция ShellExecute

писание:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
Directory: PChar; ShowCmd: Integer): HINST;

Функция может открыть или напечатать определенный файл. Исполняет как Windows-приложения так и открывает файлы-документы.
Например с файлами типа «.txt» связан Блокнот «Notepad.exe» и запуск файла «my.txt» приведет к тому, что будет запущен Блокнот и в него будет передан параметр с именем файла.

Также с помощью этой функци можно в проводнике открыть папку.

Параметры:
hWnd: Хендл родителя запускаемого приложения.

Operation: Строка определяющая команду для исполнения. Может содержать:
«open» — открыть файл определенный параметром FileName.
«print» — напечатать файл определенный параметром FileName.
«explore» — открыть папку определенную параметром FileName.
Если параметр Operation равен nil, то по умолчанию выполняется операция «open».

FileName: Определяет имя файла или папки для открытия или печати. Функция может запускать файл на исполнение или документ на печать.

Parameters: определяет параметры передаваемые при запуске исполняемого приложения. Бессмысленно его использовать при запуске документа. Параметр можеть быть равен Nil.

Directory: опеределяет каталог по умолчанию(рабочий каталог). Получитьустановить можно с помощью функций GetCurrentDirectory, SetCurrentDirectory.

ShowCmd: определяет режим открытия файла. См. константы открытияпоказа SW_.

Возвращаемые значения
Функция возвращает Хендл открытого приложения или сервера DDE. Возвращаемое значение должно быть больше 32. В противном случае это ошибка:

0 — Системе не хватает памяти, выполняемый файл испорчен или нехватает ресурсов.
ERROR_FILE_NOT_FOUND — файл не найден.
ERROR_PATH_NOT_FOUND — путь не найден.
ERROR_BAD_FORMAT — .EXE-Файл неверен (не-Win32.EXE или ошибка в .EXE).
SE_ERR_ACCESSDENIED — Операционная Система отвергла доступ к файлу.
SE_ERR_ASSOCINCOMPLETE — неправильная или неполная ассоциация с файлом.
SE_ERR_DDEBUSY — транзакция DDE не может завершаться поскольку были запущены другие транзакции.

SE_ERR_DDEFAIL — транзакция DDE потерпела неудачу.
SE_ERR_DDETIMEOUT — транзакция DDE не могла завершаться поскольку запрос несинхронизированный.
SE_ERR_DLLNOTFOUND — динамическая библиотека(.DLL) не обнаружена.
SE_ERR_FNF — файл не найден.
SE_ERR_NOASSOC — нет приложения ассоцированного с данным типом файла.
SE_ERR_OOM — недостаточно памяти для завершения операции.
SE_ERR_PNF — путь не найден.
SE_ERR_SHARE — разделение(shared) файла неверно.

Материал взят из:
Русская спpавка по Windows API

Последние из рубрики

  • SetWindowText
  • SetWindowWord winapi
  • SHBrowseForFolder winapi

MAcK

Комбайнёр

1606 / 704 / 77

Регистрация: 27.05.2008

Сообщений: 2,535

26.01.2009, 12:29

2

Лучший ответ Сообщение было отмечено как решение

Решение

Функция ShellExecute

Функция ShellExecute не только запускает программы, а открывает, редактирует или печатает файл, с учетом зарегестрированного типа, а также открывает указанную папку проводником. Возвращает Handle ссылку на открытое окно.

Используемый модуль ShellAPI. Его нужно не забыть указать в разделе Uses.

Описание: ShellExecute (hWnd: HWND; Operation: PChar; FileName: PChar; Parametrs: PChar; Directory: PChar; CmdShow: Integer): HINST;

где: hWnd – Handle родительского окна, в который будут передаваться сообщения запускаемого приложения. Можно указывать Handle-ссылку окна вашего приложения.

Operation – производимая операция. Open – открыть, print – напечатать, explore – открыть папку. По умолчанию open, если указать nil.

FileName – имя файла или документа, интернет ссылка, e-mail адрес.

Parametrs – параметры, передаваемые приложению в командной строке.

Directory – каталог по умолчанию.

CmdShow – стиль окна. Показывает, в каком состоянии будет отображаться окно при запуске. Подробно рассказано выше.

Вместо параметров Operation, Parametrs и Directory можно ставить nil. Они являются не обязательными параметрами для запуска.

В случае успешного запуска возвращает Handle окна, в случае неудачи возвращает код ошибки меньше или равное 32. Список возможных ошибок можно прочитать в справке по этой команде.

Пример использования команды ShellExecute в программе:

Delphi
1
2
3
4
5
6
7
8
9
ShellExecute (Form1.Handle, nil, 'http://programming.dax.ru', nil, nil, SW_RESTORE); //запуск нашей странички
 
ShellExecute (Form1.Handle, nil, PChar (Application.ExeName), nil, nil, SW_RESTORE); //запуск второй копии этой программы
 
ShellExecute (Form1.Handle, nil, 'iexplore', 'http://programming.dax.ru', nil, SW_RESTORE); //запуск в отдельном окне
 
ShellExecute (Form1.Handle, nil, 'mailto:semen@krovatka.net?subject=delphi', nil, nil, SW_RESTORE); //написать мне письмо
 
ShellExecute (Form1.Handle, nil, 'c:1.doc', nil, nil, SW_RESTORE); //открыть документ



20



You have to use full path to the application you are trying to start.

ExtractFilePath(Application.ExeName) will give you full path to your launcher exe.

Solution 1: using ShellExecute

procedure TFMain.ImgBtn1Click(Sender: TObject);
var 
  ExecuteResult: integer;
  Path: string;
begin
  Path := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
  ExecuteResult := ShellExecute(0, nil, PChar(Path + 'binstarter.exe'), '-lang rus', nil, SW_SHOWNORMAL);
  if ExecuteResult <= 32 then ShowMessage('Error: ' + IntToStr(ExecuteResult));
end;

You can find list of error codes at: ShellExecute function documentation

Most common error codes:

  • ERROR_FILE_NOT_FOUND 0x2
  • ERROR_PATH_NOT_FOUND 0x3

Solution 2: using ShellExecuteEx

var
  FileName, Parameters, Folder: string;
  sei: TShellExecuteInfo;
  Error: DWORD;
  OK: boolean;
begin
  Folder := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + 'bin';
  FileName := Folder + 'starter.exe';
  Parameters := '-lang rus';
  ZeroMemory(@sei, SizeOf(sei));
  sei.cbSize := SizeOf(sei);
  sei.lpFile := PChar(FileName);
  sei.lpParameters := PChar(Parameters);
  sei.lpDirectory := PChar(Folder);
  sei.nShow := SW_SHOWNORMAL;
  OK := ShellExecuteEx(@sei);
  if not OK then
    begin
      Error := GetLastError;
      ShowMessage('Error: ' + IntToStr(Error));
    end;
end;

ShellExecuteEx documentation

Solution 3: using CreateProcess

function ExecuteProcess(const FileName, Params: string; Folder: string; WaitUntilTerminated, WaitUntilIdle, RunMinimized: boolean;
  var ErrorCode: integer): boolean;
var
  CmdLine: string;
  WorkingDirP: pchar;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  Result := true;
  CmdLine := '"' + FileName + '" ' + Params;
  if Folder = '' then Folder := ExcludeTrailingPathDelimiter(ExtractFilePath(FileName));
  ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
  StartupInfo.cb := SizeOf(StartupInfo);
  if RunMinimized then
    begin
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := SW_SHOWMINIMIZED;
    end;
  if Folder <> '' then WorkingDirP := pchar(Folder)
  else WorkingDirP := nil;
  if not CreateProcess(nil, pchar(CmdLine), nil, nil, false, 0, nil, WorkingDirP, StartupInfo, ProcessInfo) then
    begin
      Result := false;
      ErrorCode := GetLastError;
      exit;
    end;
  with ProcessInfo do
    begin
      CloseHandle(hThread);
      if WaitUntilIdle then WaitForInputIdle(hProcess, INFINITE);
      if WaitUntilTerminated then
        repeat
          Application.ProcessMessages;
        until MsgWaitForMultipleObjects(1, hProcess, false, INFINITE, QS_ALLINPUT) <> WAIT_OBJECT_0 + 1;
      CloseHandle(hProcess);
    end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  FileName, Parameters, Folder: string;
  Error: integer;
  OK: boolean;
begin
  Folder := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + 'bin';
  FileName := Folder + 'starter.exe';
  Parameters := '-lang rus';
  OK := ExecuteProcess(FileName, Parameters, Folder, false, false, false, Error);
  if not OK then
    begin
      Error := GetLastError;
      ShowMessage('Error: ' + IntToStr(Error));
    end;
end;

CreateProcess documentation

Понравилась статья? Поделить с друзьями:
  • Delphi getlasterror текст ошибки
  • Delphi exception код ошибки
  • Delphi ds150e коды ошибок
  • Delphi dateseparator ошибка
  • Delphi copyfile коды ошибок