Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1

Альтернатива ShellExecute

19.04.2012, 18:40. Показов 2573. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Использую код
C++
1
2
3
4
5
    char s[100];
    strcpy( s, Edit1->Text.c_str( ) );
    ShellExecute( Handle, "open", s, NULL, NULL, SW_RESTORE );
    dt = Now( ); // формат даты
    memo->Lines->Add( DateToStr( dt ) + " " + TimeToStr( dt ) + " " + " - " + "Открыт диск: " + String( s ) );
Для открытия explorer (при подключении флэшки)
Но бывают не очень качественные картиридеры.
И мы получаем ошибку)
(Папка E:\ не существует) хоть она существует и появляется через пару секунд после ошибки.Может есть другой способ?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.04.2012, 18:40
Ответы с готовыми решениями:

ShellExecute в Embarcadero
Всем привет! Вопрос, скорее всего, по поводу типа формата параметров функции: ShellExecute(Handle, "open",...

Вопросы по ShellExecute
Доброго времени суток, у меня есть пару вопросов. Допустим открыл я консольное приложение такой командой: ShellExecuteA(Handle,...

ShellExecute не работает
Доброго времени суток. Вот такая задачка хочу открыть программу через OpenDialog вот пример : if (OpenDialog1->Execute()) { ...

18
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.04.2012, 19:14
Ну дело ведь не в ShellExecute, а в картридере...
Думаю можно попробывать просто скрыть ошибку и попробывать еще раз с задержкой по времени, а может стоит поменять параметр SW_RESTORE на другой
1
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
19.04.2012, 20:00
Цитата Сообщение от EdarGp Посмотреть сообщение
И мы получаем ошибку)
А чтобы не получать ошибку умные люди придумали обработку исключений, try...catch
1
26 / 26 / 3
Регистрация: 13.04.2012
Сообщений: 61
19.04.2012, 22:50
А ещё более умные люди придумали сначала получать сообщение о подключении устройства.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
19.04.2012, 22:52
Цитата Сообщение от Unwebo Посмотреть сообщение
А ещё более умные люди придумали сначала получать сообщение о подключении устройства.
Нутк просвети студентов.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.04.2012, 23:18
А ещё более умные люди придумали сначала получать сообщение о подключении устройства.
Думаю это само сабой разумеется, учитывая
Определенные действия при подключении флэшки
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
20.04.2012, 23:46  [ТС]
Ну дело ведь не в ShellExecute, а в картридере...
я это понимаю, но есть программа альтернатива моей, в ней это функция работает.

А ещё более умные люди придумали сначала получать сообщение о подключении устройства.
сообщения то получаю, но картридер тормозит.
А чтобы не получать ошибку умные люди придумали обработку исключений, try...catch
но при try...catch флэшка все ровно не откроется.просто небудет ошибки.
как вариант
C++
1
2
3
4
5
6
7
8
9
 OldErrorMode = SetErrorMode( SEM_FAILCRITICALERRORS ); // убираем показ ошибок
                bool ready = DirectoryExists(dl); // пытаемcя открыть корневую директорию
                if (ready)
                {   // пытаемcя открыть корневую директорию
   char s[100];
    strcpy( s, Edit1->Text.c_str( ) );
    ShellExecute( Handle, "open", s, NULL, NULL, SW_RESTORE );
else 
....
Но нет buildera под рукой проверить...

Добавлено через 5 часов 3 минуты
Странно, на Win7 нет этой ошибки только на WinXP
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 00:00
Значит проблема в реализации ShellExecute в ОС, ну или последовательности событий
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
21.04.2012, 00:14  [ТС]
Значит проблема в реализации ShellExecute в ОС, ну или последовательности событий
А какую можно альтернативу найти?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.04.2012, 00:33
Нужно эксперементировать, а так у меня наум приходит только переодически проверять на доступность (возможно в таймере,возможно в потоке)
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
21.04.2012, 00:38
Цитата Сообщение от EdarGp Посмотреть сообщение
А какую можно альтернативу найти?
А оно действительно надо? Как я понимаю, проблема в задержке доступа к кривому карт-ридеру - ну, так и обождите эти пару секунд, чего спешить?
Мониторинг по таймеру функцией DirectoryExists() либо глушить ошибки и опять же по таймеру стучаться к папке функцией ShellExecute().
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
21.04.2012, 00:38  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
   char s[100];
    strcpy( s, Edit1->Text.c_str( ) );
    bool ready = DirectoryExists(s); //
if (ready)
{
    ShellExecute( Handle, "explore", s, NULL, NULL, SW_RESTORE );
    dt = Now( ); // ôîðìàò äàòû
    memo->Lines->Add( DateToStr( dt ) + " " + TimeToStr( dt ) + " " + " - " + "Îòêðûò äèñê: " + String( s ) );
}
}
Буду так побывать но нету под рукой XP...До четверга тогда затишье)
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
16.05.2012, 17:10  [ТС]
BRcr, по таймеру, а как скрыть ошибки...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.05.2012, 18:42
При использовании ShellExecute() - не знаю. SetErrorMode() эти сообщения не убирает, насколько я знаю.

Можно в таймере что-нибудь копировать на флешку функцией SHFileOperation(), там у нее во входной структуре SHFILEOPSTRUCT есть параметр FILEOP_FLAGS fFlags - в него можно забить опцию FOF_NOERRORUI. По идее она должна гасить все диалоговые окна ошибок при выполнении функции. Стоит попробовать.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.05.2012, 18:47
поидее ShellExecute() должна возвращать false при ошибке...
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
23.05.2012, 20:37  [ТС]
не получается что то у меня false
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
23.05.2012, 21:19
Такие критические вещи как ShellExecute принято оборачивать в try...catch и обрабатывать исключения
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
23.05.2012, 21:29  [ТС]
mimicria, а как указать правильно Try-catch-throw
C++
1
2
3
4
5
6
7
8
9
10
  ProgressBar1->Position = 0;
    char disk[100];
    strcpy( disk, Edit1->Text.c_str( ) );
    bool ready = DirectoryExists(disk); // ïûòàåìcÿ îòêðûòü êîðíåâóþ äèðåêòîðèþ
    if (ready)
    {
        ShellExecute( Handle, "explore", disk, NULL, NULL, SW_RESTORE );
        dt = Now( ); // ôîðìàò äàòû
        Log->Lines->Add( DateToStr( dt ) + " " + TimeToStr( dt ) + " " + " - " + "Îòêðûò äèñê: " + "(" + Edit1->Text.SubString(1,2) +")" );
        ProgressBar1->Position = 100;
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
24.05.2012, 08:03
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ProgressBar1->Position = 0;
char disk[100];
strcpy( disk, Edit1->Text.c_str( ) );
bool ready = false;
do {
        ready=DirectoryExists(disk); // ïûòàåìcÿ îòêðûòü êîðíåâóþ äèðåêòîðèþ
        Application->ProcessMessages();
} while (!ready);
try {
        ShellExecute( Handle, "explore", disk, NULL, NULL, SW_RESTORE );
        dt = Now( ); // ôîðìàò äàòû
        Log->Lines->Add( DateToStr( dt ) + " " + TimeToStr( dt ) + " " + " - " + "Îòêðûò äèñê: " + "(" + Edit1->Text.SubString(1,2) +")" );
        ProgressBar1->Position = 100;
} catch (...) {
 ShowMessage("Error!");}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.05.2012, 08:03
Помогаю со студенческими работами здесь

ShellExecute и WinExec
использовал функцию ShellExecute, для открытия файла из программы. ShellExecute(Handle, "open", "help.chm", 0, 0,...

Подскажите по ShellExecute
ShellExecute( 0, NULL, "cmd.exe", String("/C команда").c_str(), NULL, SW_SHOW); Выполняет команду в cmd! А как сделать так, что бы в...

Не работает ShellExecute
На компе не срабатывает кнопка с кодом void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString s1; s1 =...

Трабл с ShellExecute
Всем доброго времени суток! Есть проблема. Мне в программе нужно открыть Help-файл, который правда имеет расширение Pdf:) Пробовал...

ShellExecute не канает
void __fastcall TForm1::Button1Click(TObject *Sender) { ShellExecute(NULL,"open","test.bat",NULL,NULL,SW_SHOWNORMAL); } Не...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru