Форум программистов Vingrad
| Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
Поиск: |
![]() ![]()
|
|
Опции темы |
| 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 0x2ERROR_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















|



















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