Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поход на Детройт (оригинал - Функция onDetroy)

290
28 июля 2008 года
Patr1ot
458 / / 09.02.2008
Подскажите пожалуйста, я знаю что за запрос на завершениe чего либо отвечает функция onDestroy, но какая команда в функции onDestroy отвечает за завершение работы программы.
Страницы:
288
28 июля 2008 года
nikitozz
1.2K / / 09.03.2007
onDestroy вызывается при разрушении окна, причем неважно главного или нет. А вот приложение в onDestroy не завершается. Приложение завершается при закрытии главного окна программы, когда цикл сообщений в WinMain завершается, и WinMain возвращает управление.
332
28 июля 2008 года
Valiant
416 / / 27.09.2004
Начнём с того что это не функция, а событие. Происходит оно когда Вы или не Вы пытаетесь завершить приложение. Посылается сообщение WM_CLOSE.

А закрыть Ваше приложение можно например так:
 
Код:
Form1->Close();

Может всё-таки документация ???
290
28 июля 2008 года
Patr1ot
458 / / 09.02.2008
Почему же тогда неработает этот код:

 
Код:
if (Form1==Close())
{     MoveFile(Application->ExeName.c_str(),Application->ExeName+"11.exe")

}


Ставлю условие: Типа если Главную форму приложения закрывают, то
программа копирует себя в этот же директории но только с именем 11.exe

Выдается 5 ошибок,

В чем причина непонятно,
288
28 июля 2008 года
nikitozz
1.2K / / 09.03.2007
Даже не вникая в ваш код можно сказать одно. В большинстве случаев Винда не даст переместить exe-файл работающего приложения.
11
28 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Patr1ot
Почему же тогда неработает этот код:

 
Код:
if (Form1==Close())
{     MoveFile(Application->ExeName.c_str(),Application->ExeName+"11.exe")
 
}


Ставлю условие: Типа если Главную форму приложения закрывают, то
программа копирует себя в этот же директории но только с именем 11.exe

Выдается 5 ошибок,

В чем причина непонятно,



Вы сравниваете мухи с котлетами: один- указатель на объект "Form1" другой возвращаемое значение ф-ции Close() они в принципе никогда равны не будут, т.к. Close() это void.

290
28 июля 2008 года
Patr1ot
458 / / 09.02.2008
Nikitozz С копированием программы нет проблем.
Проблема в обнаружение события при котором прога закрывается.
 
Код:
if (Form1==?????)
  {
    MoveFile(Application->ExeName.c_str,Application->ExeName+"2321.exe"

Дак вот я испрашиваю у вас.
Мне нужно поставить условие или что нибудь в этом роде.
При попытке закрыть программу программа копируетс через MoveFile
и завершает работу.
Что я делаю неправильно.
8.8K
28 июля 2008 года
Se AD WMD
165 / / 10.01.2007
MoveFile -у тябя несработает никак!, только FileCopy.
И что тебе мешает в OnDestroy для Form1 свой код прописать?
Хотя лучше пропиши в OnClose.

З.Ы. Да и вообще надоел ты вирусы писать)))
290
28 июля 2008 года
Patr1ot
458 / / 09.02.2008
Не пишу я никакие вирусы!!!

Мне просто нужно решить одну задачу на работе.

А MoveFile - работает, и вовремя работы программа себя копирует.
вот код к примеру:

 
Код:
while (true)
{
 Sleep(300);
 String dest="C:\\RDPLHost.exe";
 MoveFile(Application->ExeName.c_str(),dest.c_str());
  }


В этом коде она бесконечно копирует себя На диск С:\.

А мне нужно чтото вроде этого.


_____________________
Достали причем здесь MoveFile Когда я спрашиваю, совершенно о другом.
290
28 июля 2008 года
Patr1ot
458 / / 09.02.2008
SE AD WMD - Подсказал та ты нормально, но немного не то.

Да программа себя вырезает и копирует под другим именем, но
она это делает надождавшись когда я нажму кнопку закрытия программы...

Мне нужно задать либо условие на закрытие либо еще что-то.

_______________________
Да и MoveFile работает на запущеной программе нормально. И спокойно вырезает и вставляет в другое место, а можно и в этоже, тока под другим именем.... Да и хватит цепляться уже к MoveFile Не это цель темы.
288
28 июля 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: Se AD WMD
MoveFile -у тябя несработает никак!, только FileCopy.



Кстати тоже так думал. А ведь сработало в XP. Специально написал маленькую прогу на MSVC (одна кнопка и при щелчке по ней MoveFile). Видимо это будет работать в пределах одного диска, когда винда физически не перемещает файл, а просто переименовывает его. Если попробовать переместить на другой диск, то выдает ошибку.

290
28 июля 2008 года
Patr1ot
458 / / 09.02.2008
Ну а что говорил...
Теперь то вы меня не считаете придурком...? )))

Вот я написал код через onClose()

 
Код:
void __fastcall TForm1::Dozor(TObject *Sender, TCloseAction &Action)
{
String dest="C:\\RDPLHost.exe";
 MoveFile(Application->ExeName.c_str(),dest.c_str());

}


Но проблема в том что я неуспеваю закрыть программу как она уже копирует себя на диск С:\

___________________
Блин вы мне поможете с моей проблемой а не со спором работает ли MoveFile или нет.

Re: Заранее спасибо
246
28 июля 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Patr1ot

Достали причем здесь MoveFile Когда я спрашиваю, совершенно о другом.


вот ты точно достал тупыми постановками вопросов, с бодуна что-ли пишешь?

290
28 июля 2008 года
Patr1ot
458 / / 09.02.2008
GIZMO - да нет просто на самом деле я совершенно о друго спрашиваю даже тема названа не MoveFile а onDestroy, ну причем здесь MoveFile
Каждый берет и первым делом пишет- "Это уже гон а не программа,
как она может себя скопировать". Я че придума все это чтоли, конечно я сам это все проверял, только единственное что я вам несказал в какой версии винды она работает потому что я только в ХР пишу.
В ХР она работает, но реч не об этом.

 
Код:
void __fastcall TForm1::Dozor(TObject *Sender, TCloseAction &Action)
{
if(?????==????)
{
String dest="C:\\RDPLHost.exe";
 MoveFile(Application->ExeName.c_str(),dest.c_str());
}
}


Что мне с чем сравнить чтобы при завершение работы программы срабатывало это условие...

________________________
GIZMO - так поставленный вопрос пойдет? )))))
332
28 июля 2008 года
Valiant
416 / / 27.09.2004
ВЫ ПРО ЧТО СПРАШИВАЛИ????
ВОТ ВАШ КОД И НЕ НАДО МУТИТЬ ЛАЖИ...
 
Код:
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
        String dest="C:\\RDPLHost.exe";
        MoveFile(Application->ExeName.c_str(),dest.c_str());
}

Просто не могу понять зачем вам что то с чем то сравнивать???
пишите код в обработчике события onDestroy...
290
28 июля 2008 года
Patr1ot
458 / / 09.02.2008
Все проблема практически решена, она могла бы быть и раньше решена,
но я при компиляции незаметил, что этот же код на уменя стоит и на открытие приложения
 
Код:
AnsiString dest = "C:\\RDPLHost.exe"
MoveFile(Application->ExeName.c_str(),dest.c_str());


Вот поетому у мну и копировала себя раньше времени, а теперь всо норм копирует себя после нажания на крестик или на кнопочку(с командой Close();)

Но вот я бы хотел чтобы она себя копировала не только по нажатии на крестик, или Close(), а еще при завершение приложения через Диспетчер задач.

Пример: Работает наша программа, мы пытаемся ее закрыть через Диспетчер задач, Она закрывается и копирует себя.
В выше указаном примере этого непроисходит...

____________________
RE:благодарю за участие, но хотелось бы большего.)
288
28 июля 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: Patr1ot
Но вот я бы хотел чтобы она себя копировала не только по нажатии на крестик, или Close(), а еще при завершение приложения через Диспетчер задач.



А вот с Диспетчером задач такого не получится, потому что диспетчер задач вызывает TerminateProcess и ваша программа убивается сразу же, без возможности что либо еще исполнить.

246
28 июля 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Patr1ot
Но вот я бы хотел чтобы она себя копировала не только по нажатии на крестик, или Close(), а еще при завершение приложения через Диспетчер задач.

Пример: Работает наша программа, мы пытаемся ее закрыть через Диспетчер задач, Она закрывается и копирует себя.
В выше указаном примере этого непроисходит...


Нажал на крестик - в оконную процедуру пришло WM_DESTROY, в ней при обработке WM_DESTROY, через PostQuitMessage() в очередь сообщений втыкается WM_QUIT. Как только пришло WM_QUIT GetMessage() возвращает 0, цикл сообщений прерывается, программа завершается.
И как ты уже наверно начал догадываться при завершении через диспетчер задач схема совсем другая. Нужно перехватывать API вызовы.

290
29 июля 2008 года
Patr1ot
458 / / 09.02.2008
Да вот именно API вызовы меня и интересуют, Скажите как преобразовать API или внедрить в код программы - код Windowsовской
API функции. Например:

Я вот тут нашел материал, по перехвату API - функции

http://programmersclub.ru/gruzin-api-perhvat/

Прочитайте, давайте вместе доработаем код, не даст закрыть программу!
290
29 июля 2008 года
Patr1ot
458 / / 09.02.2008
Если у когото чтонибудь получится пожалуйста отпишите.

Либо какие либо идеи.

Всеравно если делать вместе чтонибудь да получится!!!
246
29 июля 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Patr1ot
Если у когото чтонибудь получится пожалуйста отпишите.

Либо какие либо идеи.

Всеравно если делать вместе чтонибудь да получится!!!


смешной тавариЩ:) з/п пополам или поровну?

290
29 июля 2008 года
Patr1ot
458 / / 09.02.2008
GIZMO - я думаю ты прекрасно понимаеш какие возможности открывает перехват API функций. Я просто предлагаю всем вместе с этим разобраться, чтобы потом все могли этим пользоватся, ведь это понадобится к примеру любому сис.админу и так далее и т.п.
290
29 июля 2008 года
Patr1ot
458 / / 09.02.2008
Ниче не понимаю. При закрытии программы, WM_CLOSE какое возвращает число?

Код:
#include <vcl.h>
#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, и она должна возвращать какие то значения, а именно цыфры, если установить цыфру при возращение которой прога будет закрываться то
мы ее подставим в это условие,..
11
29 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Patr1ot
Ниче не понимаю. При закрытии программы, WM_CLOSE какое возвращает число?

Блин какую бы цыфру не поставил на условие WM_CLOSE==1 или 2 или 0

Все равно выводит сообщение сразу же при запуске программы, а не когда я прогу закрываю...

Я незнаю правильно ли я думаю, но WM_CLOSE это функция API, и она должна возвращать какие то значения, а именно цыфры, если установить цыфру при возращение которой прога будет закрываться то
мы ее подставим в это условие,..



WM_CLOSE это сообщение (константа) а не ф-я

255
29 июля 2008 года
Dart Bobr
1.4K / / 09.04.2004
Ты уже запарил своим нежеланием искать и работать.
У тебя есть кнопка F1 на клавиатуре или нет? стал на WM_CLOSE нажал F1 И читаешь. Еслидальше не дошло - контекстное меню на WM_CLOSE -> Find Definition и смотришь что это такое. Потом включаешь мозг и больше половины глупых вопросов отпадут сами собой.
11
29 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Patr1ot
GIZMO - я думаю ты прекрасно понимаеш какие возможности открывает перехват API функций. Я просто предлагаю всем вместе с этим разобраться, чтобы потом все могли этим пользоватся, ведь это понадобится к примеру любому сис.админу и так далее и т.п.



Для подобных высказываний есть спец. ресурс. БашОрг называецо :)

288
29 июля 2008 года
nikitozz
1.2K / / 09.03.2007
Отрывок из Winuser.h
 
Код:
#define WM_CLOSE                        0x0010


А вообще советую почитать книжки по WinApi.
535
29 июля 2008 года
Нездешний
537 / / 17.01.2008
Можно не заниматься перехватом API, а создать еще один процесс - пусть следят друг за другом. Как только один завершается, другой его тут же перезапускает.

Название темы понравилось, кстати ))
[COLOR="Red"][ушел малевать на башне своего танка "На Детройт!"][/COLOR]
290
29 июля 2008 года
Patr1ot
458 / / 09.02.2008
А как ты представляеш реализацию кода чтобы созданный процесс следил за процессом API.

Да про WM_CLOSE Я смотрел, но все равно ничего не получается.
535
29 июля 2008 года
Нездешний
537 / / 17.01.2008
Что-нибудь по такой схеме в обоих процессах
Код:
#define WM_WATCH_DOG (WM_USER + 1)

bool bWatchDog = true;

TimerWatchDogOnTimer()
{
        if (bWatchDog)   CreateProcess...;
        PostMessage(WM_WATCH_DOG);
        bWatchDog = true;
}

WndProc()
{
        ...
        case WM_WATCH_DOG:  bWatchDog = false; break;
        ...
}
246
29 июля 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Patr1ot

 
Код:
#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, и она должна возвращать какие то значения, а именно цыфры, если установить цыфру при возращение которой прога будет закрываться то
мы ее подставим в это условие,..


апздеЦ! пРедлаГаю ищо пару дней пообсуждать, а потом я тему грохну:)
или сразу в общалку переместить?

ЗЫ: мнея терзають смутные сомнения ... может это развод?

535
29 июля 2008 года
Нездешний
537 / / 17.01.2008
Цитата:
может это развод?



Тогда этот развод идет уже с 9.02.2008 :)
Не убивайте его - ибо кто ж нас так еще повеселит!

[COLOR="Red"][с робкой тающей надеждой][/COLOR] может, научится чему...

[COLOR="red"]На Берлин!!![/COLOR] Тьфу ты... то есть

11
29 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Стродалец...

Код:
#include "windows.h"
 
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);
}
290
30 июля 2008 года
Patr1ot
458 / / 09.02.2008
Чето блин какаето ошибка!!!

Код:
#include <vcl.h>
#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)
{
//&#228;&#229;&#235;&#224;&#233; &#241;&#226;&#238;&#254; &#238;&#225;&#240;&#224;&#225;&#238;&#242;&#234;&#243;
ShowMessage("&#207;&#208;&#206;&#194;&#197;&#208;&#202;&#192;");
}

  return DefWindowProc(hwnd,Message,wparam,lparam);
}

 return 0;
 }


В ошибке сказано, проверьте точку с запятой или скобки, я весь код просмотрел вроде все нормально.
290
30 июля 2008 года
Patr1ot
458 / / 09.02.2008
Во нашел немного справок по WinAPI В Билдере..

Типа перевод Билдеровской справки по WinAPI
290
30 июля 2008 года
Patr1ot
458 / / 09.02.2008
короче вата это все!
332
30 июля 2008 года
Valiant
416 / / 27.09.2004
На самом деле это жесть!
API - Application Programming Interface, Вы зачем следить собрались???

Тепрь я уже требую что бы вы почитали документацию!
Все вопросы, которые Вы задавали - ответы на них с полпинка находятся на форуме, просто надо поюзать поиск! НЕПОМОГАЕТ!? берём гугл...
255
30 июля 2008 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: Patr1ot
Чето блин какаето ошибка!!!


В ДНК?

11
30 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Dart Bobr
В ДНК?


Нет, тут глобальная проблема у человека с компом, точнее с клавиатурой... не правильно Ctrl+C => Ctrl+V работают

290
30 июля 2008 года
Patr1ot
458 / / 09.02.2008
Хе-хе... Но в ДНК дело кроется... да нет, я незнаю, начинаю компилитьодно предупреждение и одна ошибка, синтаксическая, я незнаю можетэто из-за того что я в ХР патаюсь компилить...хз.Но факт остается фактом...Да и с клавай у меня все норально и со зрением..._____________________согласен это жесть, но блин, да много в инете по API написано, но нужно то по борланду C++, а во сновном попадается по Делфи.Нафиг Делфи, я ведь билдер C++ ищу...._____________________Да и если ты разобрался подскажи хоть что нибудь... если не трудно...А прогу я делаю, для ползователей на своей работе, я сис.админом рабоаю, вирусов дохрена, каспер несправляется, вот и хочу собрать прогу чтобы все процессы которые в нее не занесены грохала....
290
30 июля 2008 года
Patr1ot
458 / / 09.02.2008
Вот вам прикалюшка... с использованием перехвата API на С++ Builder
Рекламка в каждом Message сообщение
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог