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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2017, 12:18   #1
madpitbull
Пользователь
 
Регистрация: 03.09.2017
Сообщений: 11
По умолчанию Удаление ярлыка - C++

Здравствуйте. Помогите пожалуйста с правильным кодом?

По нажатию кнопки открывается сторонний exe файл встроенный в мое приложение и создает свой ярлык. Нужно что бы после закрытия этого приложения удалялся созданный ярлык.

Код:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
char *ResType = "EXEFILE";
 
TResourceStream* ResPtr = new TResourceStream((int)HInstance, "MYEXE", ResType);
ResPtr->SaveToFile("Kalibr.exe");
ShellExecute(Handle,"open","Kalibr.exe",NULL,NULL,SW_SHOWNORMAL);  //Г‡Г*ГЇГіГ±ГЄГ*ГҐГ¬ ГЄГ*ëèáðîâêó
delete ResPtr;
if (FileExists("Kalibr.exe"))
 try {
  DeleteFile ("Kalibr.exe");
 } catch (...) {}
Action = caFree;
}
Такой код не срабатывает и после закрытия ярлык остается.
madpitbull вне форума Ответить с цитированием
Старый 03.09.2017, 13:02   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Так не сам Kalibr.exe нужно удалить, а ярлык - *.lnk. Правильно?
Cuprum5 на форуме Ответить с цитированием
Старый 03.09.2017, 13:08   #3
madpitbull
Пользователь
 
Регистрация: 03.09.2017
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Так не сам Kalibr.exe нужно удалить, а ярлык - *.lnk. Правильно?
Получается сам Kalibr.exe распаковывается из моего приложения.
Нужно удалить этот exe файл после закрытия его окна
madpitbull вне форума Ответить с цитированием
Старый 03.09.2017, 13:26   #4
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Ну может-быть окно не успевает закрыться - поэтому он не удаляет? Попробуй задержку поставить 2 секунды перед удалением. Скажешь потом, что получилось, ладно? О, нашел функцию Sleep():
Код:
VOID Sleep(DWORD cMilliseconds)

Последний раз редактировалось Cuprum5; 03.09.2017 в 13:31.
Cuprum5 на форуме Ответить с цитированием
Старый 03.09.2017, 14:55   #5
madpitbull
Пользователь
 
Регистрация: 03.09.2017
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Ну может-быть окно не успевает закрыться - поэтому он не удаляет? Попробуй задержку поставить 2 секунды перед удалением. Скажешь потом, что получилось, ладно? О, нашел функцию Sleep():
Код:
VOID Sleep(DWORD cMilliseconds)
Извини, не знаю как это сделать.
Вышеуказанный код брал из какого то учебника.

Кстати сейчас вроде срабатывает, если поправить код так:
Код:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
char *ResType = "EXEFILE";

TResourceStream* ResPtr = new TResourceStream((int)HInstance, "MYEXE", ResType);
ResPtr->SaveToFile("Kalibr.exe");
ShellExecute(Handle,"open","Kalibr.exe",NULL,NULL,SW_SHOWNORMAL);  //Çàïóñêàåì êàëèáðîâêó
delete ResPtr;
if (FileExists("Kalibr.exe"))
 try {
  DeleteFile ("Kalibr.exe");
 } catch (...) {}
Action = (TBasicAction*)caFree;
}
Но при запуске встроенного exe-шника, выкидывает такую ошибку
Изображения
Тип файла: png Screenshot_1.png (29.4 Кб, 50 просмотров)
madpitbull вне форума Ответить с цитированием
Старый 03.09.2017, 18:34   #6
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Цитата:
Сообщение от madpitbull Посмотреть сообщение
Извини, не знаю как это сделать.
- я не понял, что ты не знаешь как делать? Функцию Sleep вызывать? Вот так, если что:
Код:
Sleep(5000);  //задержка 5 сек.

Последний раз редактировалось Cuprum5; 03.09.2017 в 18:44.
Cuprum5 на форуме Ответить с цитированием
Старый 03.09.2017, 19:08   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Где вы тут ярлык увидели? Вы просто .ехе файл создаете (саму программу).

А не удаляется потому что ShellExecute не ждет завершения программы.
Либо вызывайте удаление где-то потом в другом месте, либо используйте CreateProcess + WaitForSingleObject, примеров полно в гугле.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.09.2017, 23:05   #8
madpitbull
Пользователь
 
Регистрация: 03.09.2017
Сообщений: 11
По умолчанию

Код:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
char *ResType = "EXEFILE";

TResourceStream* ResPtr = new TResourceStream((int)HInstance, "MYEXE", ResType);
ResPtr->SaveToFile("Kalibr.exe");
ShellExecute(Handle,"open","Kalibr.exe",NULL,NULL,SW_SHOWNORMAL);  //Çàïóñêàåì êàëèáðîâêó
delete ResPtr;
Sleep(2000);
if (FileExists("Kalibr.exe"))
 try {
  DeleteFile ("Kalibr.exe");
 } catch (...) {}
Action = (TBasicAction*)caFree;
}
функция Sleep срабатывает через заданное время и exe-шник удаляется.
но выкидывает ошибку, не пойму в чем проблема
Изображения
Тип файла: png Screenshot_1.png (42.3 Кб, 42 просмотров)
Тип файла: png Screenshot_2.png (16.2 Кб, 47 просмотров)
madpitbull вне форума Ответить с цитированием
Старый 04.09.2017, 00:27   #9
madpitbull
Пользователь
 
Регистрация: 03.09.2017
Сообщений: 11
По умолчанию

Как оказалось Sleep тут не причем, функция работает и дает время на удаление!
Вышеуказанную ошибку вызывает код, который собственно удаляет exe:

Код:
if (FileExists("Kalibr.exe"))
 try {
  DeleteFile ("Kalibr.exe");
 } catch (...) {}
Action = (TBasicAction*)caFree;
Если его убрать все работает без ошибки, но соответственно exe-шник после закрытия не удаляется.

Помогите разобраться с ошибкой?
madpitbull вне форума Ответить с цитированием
Старый 04.09.2017, 01:26   #10
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

О святая вера в телепатию великих гуру!
У Вас под рукой проект, отладчик..
А мы должны посмотреть в хрустальный шар и определить место ошибки..

Пройдите этот участок по шагам в отладчике и определите точно место, на котором оно падает. Или выкладывайте проект целиком.

Пока наиболее подозрительна строка
Код:
Action = (TBasicAction*)caFree;
Что это вообще? Откуда?
Black Fregat вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создания ярлыка Volkogriz Общие вопросы Delphi 4 29.08.2014 23:32
Содержимое ярлыка Gr@nd Общие вопросы Delphi 6 13.01.2010 09:06
Стрелка у ярлыка Altera Windows 3 29.10.2008 14:45
C# Создания ярлыка MAcK Общие вопросы .NET 6 16.08.2008 12:22
Свойства ярлыка Fainder Win Api 1 26.04.2007 15:26