Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297

SaveDialog + ShellExecute

03.03.2024, 23:55. Показов 1082. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые кодеры.
Столкнулся с интересной проблемой: есть код
Delphi
1
2
if SaveDialog1.Execute then
    shellexecute(0, 'open', 'psetup.exe', nil, nil, SW_show);
Если запустить, то всё работает. Но стоит к приложению применить какой-нибудь стиль интерфейса, то строка Shellexecute работать перестает. Если убрать строку if SaveDialog1.Execute then, то снова работает. Если в сэйвдайлоге нажать на кнопку "отмена", то опять работает. Кто-нибудь знает, в чем причина аномалии? Почему со стилем интерфейса savedialog и shellexecute не дружат?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2024, 23:55
Ответы с готовыми решениями:

ShellExecute
Подскажите, в чем проблеме. Есть проект на делфи5, там запускается прога для отправки письмо через почту и все ок. Переписал на...

ShellExecute и ComboBox
Здравствуйте. С Новым Годом всех форумчан и гостей проекта. У меня вопрос по Delphi XE: Программа имеет Combobox, кнопку и два txt...

Беда с stringtowidechar и ShellExecute
народ, подскажите кто знает. нарыл такую вещь как ShellExecute. ею открываю файл, чтоб само открылось нужное приложение. вид функции...

16
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,341
Записей в блоге: 3
04.03.2024, 04:43
Не воспроизводится. Предоставьте минимальный пример, где ошибка бы воспроизводилась.
0
Нарушитель
10225 / 5655 / 1257
Регистрация: 12.03.2015
Сообщений: 26,181
04.03.2024, 08:37
Цитата Сообщение от t232006 Посмотреть сообщение
то строка Shellexecute работать перестает
А что возвращает ShellExecute()? Это ж функция.
И чо такое psetup.exe, в какой папке оно находится? Что если временно указать абсолютный путь?
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
04.03.2024, 11:10  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
И чо такое psetup.exe, в какой папке оно находится? Что если временно указать абсолютный путь?
psetup.exe - это совершенно любой исполняемый файл. Я пробовал с несколькими: и с параметрами, и без.
Цитата Сообщение от D1973 Посмотреть сообщение
Предоставьте минимальный пример, где ошибка бы воспроизводилась.
Во вложении архив с минимальной программой. Одна кнопка запускает некий исполняемый файл (файл пишет в консоли "Hello! I am some exe file"). Другая делает то же, но предварительно запускает SaveDialog. К программе применен некий стиль (неважно какой, не работает с любым). Так вот, нужно, чтобы при нажатии на вторую кнопку после SaveDialog'а запускался исполняемый файл. Он запустился бы, если бы к программе не был применен стиль.
Вложения
Тип файла: zip ExampleSaveDialog.zip (4.59 Мб, 6 просмотров)
0
Нарушитель
10225 / 5655 / 1257
Регистрация: 12.03.2015
Сообщений: 26,181
04.03.2024, 11:19
Цитата Сообщение от t232006 Посмотреть сообщение
Во вложении архив с минимальной программой.
Модули потерял. Давай по-новой, Миша.

0
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
04.03.2024, 14:53
Но стоит к приложению применить какой-нибудь стиль интерфейса
Манифест?
0
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
04.03.2024, 16:38  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Модули потерял. Давай по-новой, Миша.
я сильно извиняюсь.
Вложения
Тип файла: zip saveDialog_shellExecute.zip (4.20 Мб, 5 просмотров)
0
4187 / 1835 / 220
Регистрация: 06.10.2010
Сообщений: 4,123
04.03.2024, 17:10
Лучший ответ Сообщение было отмечено t232006 как решение

Решение

Похоже ShellExecute возвращает ERROR_FILE_NOT_FOUND, так как SaveDialog меняет текущую директорию.
2
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
04.03.2024, 19:24  [ТС]
Цитата Сообщение от murderer Посмотреть сообщение
Похоже ShellExecute возвращает ERROR_FILE_NOT_FOUND, так как SaveDialog меняет текущую директорию.
Кстати, да. Очень интересно! Только почему он ее меняет если только применен стиль?
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
05.03.2024, 02:14
Цитата Сообщение от t232006 Посмотреть сообщение
Кстати, да. Очень интересно! Только почему он ее меняет если только применен стиль?
Вообще-то он меняет её всегда! Почему вы это заметили только при изменении стиля?
P.S. И уже лет 20+ надоело говорить что текущая директория это архаизм времён MS-DOS. И никогда не стоит её использовать! Точнее никогда на неё не надеяться.
1
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,328
05.03.2024, 08:42
Цитата Сообщение от t232006 Посмотреть сообщение
Кстати, да. Очень интересно!
Предлагали же попробовать абсолютный (полный) путь:
Цитата Сообщение от Verevkin Посмотреть сообщение
Что если временно указать абсолютный путь?
1
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
05.03.2024, 14:30  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Вообще-то он меняет её всегда!
Вообще-то нет. Если завести переменную, мониторящую текущий каталог и убрать стиль, то при OpenDialog.Execute текущий каталог остается прежним. А если оставить, то меняется. Возможно, это связано с тем, что при применении стиля окно получается в стиле более ранних версий Windows (оно визуально меняется).
Цитата Сообщение от AzAtom Посмотреть сообщение
Предлагали же попробовать абсолютный (полный) путь:
Эх... если бы было всё так просто. Не могу объяснить в двух словах, но абсолютный путь мне не подходит. Если попытаться объяснить, то ShellExecute здесь только для примера. На самом деле там задействована функция CreateProcess, а она с абсолютными путями не очень дружит. Там сложные отношения с параметрами и прочим... не хочу углубляться, ибо не тема.
А вообще вопрос стоял не как это лечить, а почему это происходит. А так-то, зная причину, вылечить не проблема.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,654
Записей в блоге: 21
05.03.2024, 15:41
бррр
абсолютный путь - это единственный способ указать на файл
и CreateProcess совершенно не исключение

если вы хотите запускать что-то, к чему путь вы не знаете, и пусть система сама ищет по своим путям, то запускайте cmd.exe c параметрами
точно так же, через CreateProcess

Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
unit RunProgramUnit;
 
interface
  procedure RunProgram(cmdStr:string; Wait:Boolean; ShowWindow:Word);
 
implementation
uses
  windows, sysutils, dialogs;
 
procedure RunProgram(cmdStr:string; Wait:Boolean; ShowWindow:Word);
var si:TStartupInfo;
  pi:TProcessInformation;
  s:string;
begin
  FillChar(si, SizeOf(si), 0);
  si.cb := SizeOf(si);
  si.dwFlags:=STARTF_USESHOWWINDOW;
  si.wShowWindow := ShowWindow;
  s:=cmdStr;
  UniqueString(s);
  getlasterror;
  if not CreateProcess(nil, PChar(S), NIL, NIL, False, 0, NIL, NIL, si, pi) then
    showMessageFmt('Error %d. %s',[getlasterror,SysErrorMessage(getlasterror)]);
 
  if wait then
    WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
end;
 
 
end.
2
4 / 4 / 0
Регистрация: 09.12.2022
Сообщений: 297
05.03.2024, 16:13  [ТС]
krapotkin, спасибо за информацию, но это не тема данного обсуждения. Убил кучу времени на распознание, что именно у меня в нем не работает, оказалось, что абсолютный путь ему не нравится и еще куча всяких неочевидных вещей... В общем, не суть. Решил обходными маневрами. И да, Ваш тред об этом я тоже читал в одном из обсуждений и принял во внимание.
0
Нарушитель
10225 / 5655 / 1257
Регистрация: 12.03.2015
Сообщений: 26,181
05.03.2024, 16:35
Цитата Сообщение от t232006 Посмотреть сообщение
функция CreateProcess, а она с абсолютными путями не очень дружит.
Чо сказал??!
1
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,654
Записей в блоге: 21
05.03.2024, 19:26
расходимся, абсолютный путь ему не нравится ))))
1
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
06.03.2024, 01:31
Цитата Сообщение от t232006 Посмотреть сообщение
Если завести переменную, мониторящую текущий каталог и убрать стиль, то при OpenDialog.Execute текущий каталог остается прежним. А если оставить, то меняется. Возможно, это связано с тем, что при применении стиля окно получается в стиле более ранних версий Windows (оно визуально меняется).
Не верю про стиль более ранних версий Windows.
Единственно от чего может зависеть сохранение или не сохранение текущей директории/каталога это опция диалога
ofNoChangeDir ----- After the user clicks OK, resets the current directory to whatever it was before the file-selection dialog opened
И это цитата из справки Д6. Какие ещё более старые версии Windows вы знаете?

Добавлено через 9 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
расходимся, абсолютный путь ему не нравится ))))
Возможно ТС просто не умеет его готовить.
t232006, попробуйте для начала заключить этот путь в двойные кавычки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2024, 01:31
Помогаю со студенческими работами здесь

Как подождать ShellExecute?
Запускаю WinRar таким образом: //делит на указанные части procedure divisionFile(FileNameIn, FileNameOut: string; sizedivision:...

Отслеживание ShellExecute, WinExec
Привет всем! Хотел бы задать небольшой вопрос, т.к. решения в гугле не нашёл. Что мне нужно: 1) Отследить ShellExecute или...

savedialog
if (SaveDialog.Execute()) then beFileName.Text := SaveDialog.FileName; // например 1.doc а как мне сделать 1ДАТА.doc ?? ДАТА -...

SaveDialog
Привет. У меня есть файл f, содержимое которого я загрузил в memo(с помощью oendialog), потом в memo подкорректировал его, как сделать(с...

Savedialog
Как сделать так, чтобы при использовании компоненты savedialog, по в какой файл сохранять данные оставалось пустым?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru