Поход на Детройт (оригинал - Функция onDetroy)
А закрыть Ваше приложение можно например так:
Может всё-таки документация ???
{ MoveFile(Application->ExeName.c_str(),Application->ExeName+"11.exe")
}
Ставлю условие: Типа если Главную форму приложения закрывают, то
программа копирует себя в этот же директории но только с именем 11.exe
Выдается 5 ошибок,
В чем причина непонятно,
{ MoveFile(Application->ExeName.c_str(),Application->ExeName+"11.exe")
}
Ставлю условие: Типа если Главную форму приложения закрывают, то
программа копирует себя в этот же директории но только с именем 11.exe
Выдается 5 ошибок,
В чем причина непонятно,
Вы сравниваете мухи с котлетами: один- указатель на объект "Form1" другой возвращаемое значение ф-ции Close() они в принципе никогда равны не будут, т.к. Close() это void.
Проблема в обнаружение события при котором прога закрывается.
{
MoveFile(Application->ExeName.c_str,Application->ExeName+"2321.exe"
Дак вот я испрашиваю у вас.
Мне нужно поставить условие или что нибудь в этом роде.
При попытке закрыть программу программа копируетс через MoveFile
и завершает работу.
Что я делаю неправильно.
И что тебе мешает в OnDestroy для Form1 свой код прописать?
Хотя лучше пропиши в OnClose.
З.Ы. Да и вообще надоел ты вирусы писать)))
Мне просто нужно решить одну задачу на работе.
А MoveFile - работает, и вовремя работы программа себя копирует.
вот код к примеру:
{
Sleep(300);
String dest="C:\\RDPLHost.exe";
MoveFile(Application->ExeName.c_str(),dest.c_str());
}
В этом коде она бесконечно копирует себя На диск С:\.
А мне нужно чтото вроде этого.
_____________________
Достали причем здесь MoveFile Когда я спрашиваю, совершенно о другом.
Да программа себя вырезает и копирует под другим именем, но
она это делает надождавшись когда я нажму кнопку закрытия программы...
Мне нужно задать либо условие на закрытие либо еще что-то.
_______________________
Да и MoveFile работает на запущеной программе нормально. И спокойно вырезает и вставляет в другое место, а можно и в этоже, тока под другим именем.... Да и хватит цепляться уже к MoveFile Не это цель темы.
Кстати тоже так думал. А ведь сработало в XP. Специально написал маленькую прогу на MSVC (одна кнопка и при щелчке по ней MoveFile). Видимо это будет работать в пределах одного диска, когда винда физически не перемещает файл, а просто переименовывает его. Если попробовать переместить на другой диск, то выдает ошибку.
Теперь то вы меня не считаете придурком...? )))
Вот я написал код через onClose()
{
String dest="C:\\RDPLHost.exe";
MoveFile(Application->ExeName.c_str(),dest.c_str());
}
Но проблема в том что я неуспеваю закрыть программу как она уже копирует себя на диск С:\
___________________
Блин вы мне поможете с моей проблемой а не со спором работает ли MoveFile или нет.
Re: Заранее спасибо
Достали причем здесь MoveFile Когда я спрашиваю, совершенно о другом.
вот ты точно достал тупыми постановками вопросов, с бодуна что-ли пишешь?
Каждый берет и первым делом пишет- "Это уже гон а не программа,
как она может себя скопировать". Я че придума все это чтоли, конечно я сам это все проверял, только единственное что я вам несказал в какой версии винды она работает потому что я только в ХР пишу.
В ХР она работает, но реч не об этом.
{
if(?????==????)
{
String dest="C:\\RDPLHost.exe";
MoveFile(Application->ExeName.c_str(),dest.c_str());
}
}
Что мне с чем сравнить чтобы при завершение работы программы срабатывало это условие...
________________________
GIZMO - так поставленный вопрос пойдет? )))))
ВОТ ВАШ КОД И НЕ НАДО МУТИТЬ ЛАЖИ...
{
String dest="C:\\RDPLHost.exe";
MoveFile(Application->ExeName.c_str(),dest.c_str());
}
Просто не могу понять зачем вам что то с чем то сравнивать???
пишите код в обработчике события onDestroy...
но я при компиляции незаметил, что этот же код на уменя стоит и на открытие приложения
MoveFile(Application->ExeName.c_str(),dest.c_str());
Вот поетому у мну и копировала себя раньше времени, а теперь всо норм копирует себя после нажания на крестик или на кнопочку(с командой Close();)
Но вот я бы хотел чтобы она себя копировала не только по нажатии на крестик, или Close(), а еще при завершение приложения через Диспетчер задач.
Пример: Работает наша программа, мы пытаемся ее закрыть через Диспетчер задач, Она закрывается и копирует себя.
В выше указаном примере этого непроисходит...
____________________
RE:благодарю за участие, но хотелось бы большего.)
А вот с Диспетчером задач такого не получится, потому что диспетчер задач вызывает TerminateProcess и ваша программа убивается сразу же, без возможности что либо еще исполнить.
Пример: Работает наша программа, мы пытаемся ее закрыть через Диспетчер задач, Она закрывается и копирует себя.
В выше указаном примере этого непроисходит...
Нажал на крестик - в оконную процедуру пришло WM_DESTROY, в ней при обработке WM_DESTROY, через PostQuitMessage() в очередь сообщений втыкается WM_QUIT. Как только пришло WM_QUIT GetMessage() возвращает 0, цикл сообщений прерывается, программа завершается.
И как ты уже наверно начал догадываться при завершении через диспетчер задач схема совсем другая. Нужно перехватывать API вызовы.
API функции. Например:
Я вот тут нашел материал, по перехвату API - функции
http://programmersclub.ru/gruzin-api-perhvat/
Прочитайте, давайте вместе доработаем код, не даст закрыть программу!
Либо какие либо идеи.
Всеравно если делать вместе чтонибудь да получится!!!
Либо какие либо идеи.
Всеравно если делать вместе чтонибудь да получится!!!
смешной тавариЩ:) з/п пополам или поровну?
#include <Forms.hpp>
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
if (WM_CLOSE==0)
String dest="C:\\1.exe" ;
ShowMessage("проверка");
return 0;
}
Блин какую бы цыфру не поставил на условие WM_CLOSE==1 или 2 или 0
Все равно выводит сообщение сразу же при запуске программы, а не когда я прогу закрываю...
Я незнаю правильно ли я думаю, но WM_CLOSE это функция API, и она должна возвращать какие то значения, а именно цыфры, если установить цыфру при возращение которой прога будет закрываться то
мы ее подставим в это условие,..
Блин какую бы цыфру не поставил на условие WM_CLOSE==1 или 2 или 0
Все равно выводит сообщение сразу же при запуске программы, а не когда я прогу закрываю...
Я незнаю правильно ли я думаю, но WM_CLOSE это функция API, и она должна возвращать какие то значения, а именно цыфры, если установить цыфру при возращение которой прога будет закрываться то
мы ее подставим в это условие,..
WM_CLOSE это сообщение (константа) а не ф-я
У тебя есть кнопка F1 на клавиатуре или нет? стал на WM_CLOSE нажал F1 И читаешь. Еслидальше не дошло - контекстное меню на WM_CLOSE -> Find Definition и смотришь что это такое. Потом включаешь мозг и больше половины глупых вопросов отпадут сами собой.
Для подобных высказываний есть спец. ресурс. БашОрг называецо :)
А вообще советую почитать книжки по WinApi.
Название темы понравилось, кстати ))
[COLOR="Red"][ушел малевать на башне своего танка "На Детройт!"][/COLOR]
Да про WM_CLOSE Я смотрел, но все равно ничего не получается.
bool bWatchDog = true;
TimerWatchDogOnTimer()
{
if (bWatchDog) CreateProcess...;
PostMessage(WM_WATCH_DOG);
bWatchDog = true;
}
WndProc()
{
...
case WM_WATCH_DOG: bWatchDog = false; break;
...
}
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
if (WM_CLOSE==0)
String dest="C:\\1.exe" ;
ShowMessage("проверка");
return 0;
}
Блин какую бы цыфру не поставил на условие WM_CLOSE==1 или 2 или 0
Все равно выводит сообщение сразу же при запуске программы, а не когда я прогу закрываю...
Я незнаю правильно ли я думаю, но WM_CLOSE это функция API, и она должна возвращать какие то значения, а именно цыфры, если установить цыфру при возращение которой прога будет закрываться то
мы ее подставим в это условие,..
апздеЦ! пРедлаГаю ищо пару дней пообсуждать, а потом я тему грохну:)
или сразу в общалку переместить?
ЗЫ: мнея терзають смутные сомнения ... может это развод?
Тогда этот развод идет уже с 9.02.2008 :)
Не убивайте его - ибо кто ж нас так еще повеселит!
[COLOR="Red"][с робкой тающей надеждой][/COLOR] может, научится чему...
[COLOR="red"]На Берлин!!![/COLOR] Тьфу ты... то есть
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_QUESTION));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "Test Window";
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_QUESTION));
RegisterClassEx(&wcex);
hwnd = [COLOR=black]CreateWindow[/COLOR]("Test Window", "Test Window", WS_OVERLAPPEDWINDOW,
10, 10, 600, 480, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
if (Message == WM_DESTROY )
{
PostQuitMessage(0);
return 0;
}
if (Message == WM_CLOSE)
{
//делай свою обработку
}
return DefWindowProc(hwnd,Message,wparam,lparam);
}
#include <windows.h>
#include <winuser.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_QUESTION));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "Test Window";
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_QUESTION));
RegisterClassEx(&wcex);
hwnd = CreateWindow("Test Window", "Test Window", WS_OVERLAPPEDWINDOW,
10, 10, 600, 480, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
if (Message == WM_DESTROY )
{
PostQuitMessage(0);
return 0;
}
if (Message == WM_CLOSE)
{
//äåëàé ñâîþ îáðàáîòêó
ShowMessage("ÏÐÎÂÅÐÊÀ");
}
return DefWindowProc(hwnd,Message,wparam,lparam);
}
return 0;
}
В ошибке сказано, проверьте точку с запятой или скобки, я весь код просмотрел вроде все нормально.
Типа перевод Билдеровской справки по WinAPI
API - Application Programming Interface, Вы зачем следить собрались???
Тепрь я уже требую что бы вы почитали документацию!
Все вопросы, которые Вы задавали - ответы на них с полпинка находятся на форуме, просто надо поюзать поиск! НЕПОМОГАЕТ!? берём гугл...
В ДНК?
Нет, тут глобальная проблема у человека с компом, точнее с клавиатурой... не правильно Ctrl+C => Ctrl+V работают
Рекламка в каждом Message сообщение