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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2017, 01:58   #11
madpitbull
Пользователь
 
Регистрация: 03.09.2017
Сообщений: 11
По умолчанию

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

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

Пока наиболее подозрительна строка
Код:
Action = (TBasicAction*)caFree;
Что это вообще? Откуда?
Да действительно, что то не понятное происходит, выкладываю проект и прошу помощи в его корректной работе.

И Вы верно заметили, ошибку вызывает именно строка Action = (TBasicAction*)caFree;
Вложения
Тип файла: zip proekt.zip (14.3 Кб, 14 просмотров)
madpitbull вне форума Ответить с цитированием
Старый 04.09.2017, 04:01   #12
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Ну так без этой строчки проект работает? Или всё же нет?
Black Fregat вне форума Ответить с цитированием
Старый 04.09.2017, 08:09   #13
madpitbull
Пользователь
 
Регистрация: 03.09.2017
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Ну так без этой строчки проект работает? Или всё же нет?
Проект работает, но не удаляет после закрытия распакованный 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;
Sleep(2000);
if (FileExists("Kalibr.exe"))
 try {
  DeleteFile ("Kalibr.exe");
 } catch (...) {}
}
Точнее распакованный exe-шник удаляется если успеть закрыть его окно в течении времени, указанного в функции Slepp,если продержать окно открытым больше, в этом примере 2 секунд, то соответственно он остается не удаленным.
madpitbull вне форума Ответить с цитированием
Старый 04.09.2017, 08:14   #14
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Я ж говорил уже что делать надо
Я видел Ваше сообщение и почитал вчера про CreateProcess + WaitForSingleObject и честно говоря, пока не понял как применить это здесь)

Если Вам не трудно, подскажите пожалуйста правильный код для моей задачи?
madpitbull вне форума Ответить с цитированием
Старый 04.09.2017, 08:42   #16
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Что как применить? У вас задача запустить программу и дождаться ее завершения. Любой пример с CreateProcess + WaitForSingleObject делает именно это.
Так в том то и дело, что с запуском и завершением нет проблем, и даже с удалением распакованного exe после закрытия приложения, что было основной задачей.

Однако удаляется распакованный exe только в промежуток времени, заданное в Sleep. Если окно приложения не закрыть за это время, то он не удаляется.

Я вот и прошу Вас помочь, как сделать, что бы приложение ждало пока не удалится распакованный ранее exe?
madpitbull вне форума Ответить с цитированием
Старый 04.09.2017, 10:13   #18
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от madpitbull Посмотреть сообщение
Однако удаляется распакованный exe только в промежуток времени
facepalm.png

Я ж 2 раза уже сказал, что не удаляется потому что ShellExecute не ждет завершения программы (и во время выполнения программу нельзя удалить). То есть на строке с ShellExecute ваша программа (основная) не останавливается до завершения той программы, а идет дальше.

Соответственно если немного подумать, то несложно понять, что надо например дождаться ее завершения перед вызовом удаления.

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

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вложение 89367

Я ж 2 раза уже сказал, что не удаляется потому что ShellExecute не ждет завершения программы (и во время выполнения программу нельзя удалить). То есть на строке с ShellExecute ваша программа (основная) не останавливается до завершения той программы, а идет дальше.

Соответственно если немного подумать, то несложно понять, что надо например дождаться ее завершения перед вызовом удаления.

Один из вариантов это сделать: запускать через CreateProcess вместо ShellExecute, он возвращает handle процесса, который можно использовать для ожидания завершения процесса с помощью WaitForSingleObject.
Я действительно многого еще не понимаю и не могу реализовать то, что мне нужно. Поэтому и прошу Вас пример такого-верного кода.

И еще может не верно понимаю но, основная программа не должна закрываться, вся основная работа проходит в ней, а сторонняя вызывается только по необходимости.
madpitbull вне форума Ответить с цитированием
Старый 04.09.2017, 13:32   #20
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 734
По умолчанию

caFree больше похожа на константу, хотя я не разбираюсь в Actionah.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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