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

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2013, 14:11   #1
WindRunner
 
Аватар для WindRunner
 
Регистрация: 30.07.2010
Сообщений: 7
Стрелка Ошибка ShellExecute: Параметр задан неверно

Доброго времени суток!
Сделал на Делфи AutoRun (автозагрузчик для дисков) . Доступ к папкам и экзешникам на диске осуществляется через ShellExecute:

ShellExecute(handle, 'open', 'Документация', nil, nil, sw_show);
ShellExecute(handle, 'open', 'install.exe', nil, nil, sw_show);

При тестировании программы на компе, все отлично. Все папки открываются без проблем.

Запускаю программу с диска. На окне появляется мое окно с выбором того что можно сделать: «установить программу», «обновить», «документация» и так далее.
При выборе, например «Документация», открывается папка с документацией. Закрываю папку, пробую еще раз, выдается ошибка Explorer.EXE: «Параметр задан неверно».
В обработчике кнопки «Документация» только ShellExecute.
Причем, это ошибка возникает, только если пытаешься открыть папки, при открытии экзешников все нормально.

Опытным путем определил, что если зайти в компьютер под администратором или запустить программу от имени администратора, то такой ошибки не возникает.
Таким образом, это ошибка ShellExecute связанная с правами доступа.

Подскажите, как можно решить данную задачку
WindRunner вне форума Ответить с цитированием
Старый 08.08.2013, 15:44   #2
Max1548
Пользователь
 
Регистрация: 28.05.2011
Сообщений: 99
По умолчанию

Поставить манифест на права администратора? Чтобы сразу запускалась от имени админа и без проблем?
OS - [||-----------------------------------------------] забил, дойдя до драйвера памяти
Max1548 вне форума Ответить с цитированием
Старый 08.08.2013, 18:10   #3
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
При выборе, например «Документация», открывается папка с документацией. Закрываю папку, пробую еще раз, выдается ошибка Explorer.EXE: «Параметр задан неверно».
В обработчике кнопки «Документация» только ShellExecute.
Причем, это ошибка возникает, только если пытаешься открыть папки
При открытии папки меняется текущая директория (CurrentDir). При первом вызове ShellExecute текущая директория это "папка где лежит ЕХЕ-шик". При повторном вызове текущая директория это "папка где лежит ЕХЕ-шик"/Документация. Так что при повторном вызове вы пытаетесь открыть папку "папка где лежит ЕХЕ-шик"/Документация/Документация

Замените
Код:
ShellExecute(handle, 'open', 'Документация', nil, nil, sw_show);
на
Код:
ShellExecute(handle, 'open', PChar(ExtractFilePath(Application.ExeName)+'Документация'), nil, nil, sw_show);

Последний раз редактировалось northener; 08.08.2013 в 18:15.
northener вне форума Ответить с цитированием
Старый 12.08.2013, 17:45   #4
WindRunner
 
Аватар для WindRunner
 
Регистрация: 30.07.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
При открытии папки меняется текущая директория (CurrentDir). При первом вызове ShellExecute текущая директория это "папка где лежит ЕХЕ-шик". При повторном вызове текущая директория это "папка где лежит ЕХЕ-шик"/Документация. Так что при повторном вызове вы пытаетесь открыть папку "папка где лежит ЕХЕ-шик"/Документация/Документация [/CODE]
В данном случае, у меня директория не меняется (для тестирования поставил вызов MessageBox), как при первом запуске была директория "Документация", при втором также и осталась.

Добавил определения пути к .exe (PChar(ExtractFilePath(Application. ExeName)+'Документация') результат тот же.

Вероятно, нужно все таки делать автоматический запуск программы от имени администратора.
WindRunner вне форума Ответить с цитированием
Старый 13.08.2013, 11:33   #5
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Так тоже не заработает у вас?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  S :string; // чтобы визуально меньше места занимал код
begin
 S := ExtractFilePath(ParamStr(0)) + 'Документация';
  // вместо "Handle" в "ShellExecute" также можно писать "0".
  // ShellExecute(0, nil, PChar(S), nil, nil, SW_NORMAL);
  // v1. Просто открыть папку
 ShellExecute(Handle, nil, PChar(S), nil, nil, SW_NORMAL);
  // v 2. Открывается двухпанельное окно Explorer
 ShellExecute(Handle, nil, PChar('Explorer'), PChar(Format('/e,/root,"%s"', [S])),
              nil, SW_NORMAL);
  // v3. Выделяем папку в проводнике
 ShellExecute(Handle, nil, PChar('Explorer'),
              PChar(Format('/e,/select,"%s"', [S])),
              nil, SW_NORMAL);
end;
Alter вне форума Ответить с цитированием
Старый 24.08.2013, 15:10   #6
WindRunner
 
Аватар для WindRunner
 
Регистрация: 30.07.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Alter Посмотреть сообщение
Так тоже не заработает у вас?
// v1. Просто открыть папку
ShellExecute(Handle, nil, PChar(S), nil, nil, SW_NORMAL);
Результат такой же - не работает! (с нулем тоже)

// v 2. Открывается двухпанельное окно Explorer
ShellExecute(Handle, nil, PChar('Explorer'), PChar(Format('/e,/root,"%s"', [S])),
nil, SW_NORMAL);
Ошибка explorer.exe: "Этому файлу не сопоставлена программа для выполнения этого действия. Установите программу или, если она уже установлена, создайте сопоставление с помощью компонента панели управления "Программы по умолчанию"

// v3. Выделяем папку в проводнике
ShellExecute(Handle, nil, PChar('Explorer'),
PChar(Format('/e,/select,"%s"', [S])),
nil, SW_NORMAL);
В общем то так можно обойти данную ошибку (ошибка не возникает), т.к., тут не происходит открытие конкретной папки, а открывается только текущая папка где лежит exe файл и выделяется нужная папка. Но это не особо удобно!
WindRunner вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в VBA.Type-mismatch. Где я неверно указала тип переменной? mozart2012 Помощь студентам 4 28.01.2013 15:33
Посмотрите, где ошибка! Пусть задан текст до точки. Поменяйте все строчные латинские буквы,которые встречаются в тексте, на проп Lalalako3 Паскаль, Turbo Pascal, PascalABC.NET 5 29.11.2012 13:28
неверно считает? штохл Microsoft Office Excel 3 17.05.2010 22:24
ShellExecute - параметр не работает? heart Win Api 2 12.03.2009 15:45
параметр ShowCmd в ShellExecute Евгений_k Общие вопросы Delphi 9 16.04.2008 16:37