Форум программистов Vingrad
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
Поиск: |
|
ShellExecute Как отловить его ошибки? |
Опции темы |
brick-rs |
|
||
Новичок Профиль
Репутация: нет
|
Подскажите плиз, использую ShellExecute для открытия разных доков, и т.п… Вопрос встал как отловить его ошибки? причем как таковыми ошибками они не вываливаааются, но если при открытии дока что то у него не получилось то он просто молчит, если все нормально то он открывает все Ок. На предмет существования дока проверку делаю. Это сообщение отредактировал(а) brick-rs — 28.7.2004, 03:10 |
||
|
|||
Cashey |
|
||
Бессмертный Профиль
Репутация: нет
|
Функция возвращает дескриптор открытого приложения. Если возвращаемое значение меньше или равно 32, это указывает на ошибку. Для Windows старше 95-го эти константы означают: ——————— библия учит любить ближнего, а камасутра обучает как именно |
||
|
|||
brick-rs |
|
||
Новичок Профиль
Репутация: нет
|
а вот собственно в том то и весь вопрос как этот дескриптор проверить? не знаю еще не разу не сталкивался |
||
|
|||
<Spawn> |
|
||
Око кары:) Профиль
Репутация: 1
|
brick-rs Все просто:
——————— «Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать» — Николай Безруков. |
||
|
|||
Vit |
|
||
Vitaly Nevzorov Профиль
Репутация: 1
|
Используй CreateProcess — гораздо больше возможностей, и по отлову ошибок в том числе… ——————— With the best wishes, Vit |
||
|
|||
saw666 |
|
||
Новичок Профиль Репутация: нет
|
Специально зарегистрировался чтобы поблагодарить за это сообщение. Да, даже в 2016 году оно оказалось полезным. Спасибо! ))) |
||
|
|||
navodri |
|
||
Бывалый Профиль Репутация: нет
|
Вот так просто:
|
||
|
|||
|
Правила форума «Delphi: WinAPI и системное программирование» | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, 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
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
.
answered Feb 23, 2013 at 15:32
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 в программе:
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