|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Не могу поймать исключение ShellExecuteEx
Доброе время суток форумчане
Была и есть у меня библиотека, только с некоторых пор у меня стала через раз работать функция «ShellExecute» (раз, 2, 3 откроет word файл, и все, далее программа файл создает, но не открывает (файл word – корректный, к тому же создает один и тот же файл по одному алгоритму)), Заменил ее на «ShellExecuteEx» Код:
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. В чем может быть причина? Заранее спасибо за ответ. |
#2
|
|||
|
|||
проверяй не прямой возврат из ShellExecuteEx, а значение в hInstApp > 32.
В MSDN написано, что по факту управление передается Shell Extention, т.е. сама функция может и отработать, а вот то, кому она передала управление - нет. Т.е. код должен выглядеть как-то так: Код:
var rc : Boolean; ... rc := ShellExecuteEx(@ShellExecuteInfo) if (rc = False Or ShellExecuteInfo.hInstApp <=32) 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('Нет приложения, связанного с файлом'); Else ShowMessage('Неизвестная ошибка...'); end end else ShowMessage('All right'); ... |
#3
|
|||
|
|||
кажется нашел проблему: у меня функция сохраняющий документ
Код:
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; Код:
Words_Templs := Unassigned; CoUninitialize; только 10 это как-то обрабатывала, а ХР - отказывалась Во всяком случае после этой замены, все пока открывается без проблем |