Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];




Вниз

КАК ПРОГАММУ НЕ ИМЕЮЩУУ ФОРМЫ, ОСТАВИТЬ РЕЗИДЕТНОЙ???? 


Жаждущий!   (2002-01-31 04:36) [0]

Народ! Подкажите плиз. subj



drpass   (2002-01-31 15:00) [1]

Дык, прога начинает исполняться от слова begin, и заканчивается по слову end.
Вот ты вставь какой-нибудь умный цикл между этими двумя словами, и поверь мне, она останется "резидентной" //кстати, нет такого понятия в винде. Это тебе не ДОС.



Жаждущий!   (2002-01-31 17:03) [2]

to dr pass

Слышь, умник ты мне про дос не рассказывай....
А нащет цикла, то если таковой сделать - программа подвиснет и винда тоже.... что такое приорететность знаешь?



ev   (2002-01-31 17:06) [3]

в цикле поставь Application.ProcessMessages; - висеть не будет!



Виктор Щербаков   (2002-01-31 17:14) [4]

>программа подвиснет и винда тоже....
Вот Windows как раз и не подвиснет, а продолжит нормальную работу.

А если ты хочешь, чтобы твое творение не отнимало почти всё время процессора, то поставь в цикле sleep, если пишешь без VCL.



Bachin   (2002-01-31 17:41) [5]

Резюме: если скучно - пиши свой TApplication :)))



panov   (2002-01-31 18:04) [6]

Вообще-то, программы, как правило, пишутся для выполнения какой-либо полезной работы, а не для того, чтобы оставаться резидентными.



Suntechnic   (2002-01-31 18:28) [7]

>panov © (31.01.02 18:04)
>Вообще-то, программы, как правило, пишутся для выполнения какой-либо полезной работы, а не для того, чтобы оставаться резидентными.

Вот и он о том же :) Типичный пример COM exe сервер. Кто сказал, что у него должна быть форма?

>Жаждущий! (31.01.02 04:36)
Запускай цикл обработки сообщений. Примерно вот так(сорри, что на С, но мне так быстрее :)):

MSG ms;
BOOL bRet;
while( (bRet = GetMessage( &ms, NULL, 0, 0 )) != 0 )
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}

А заканчивай вот так:

PostMessage( NULL, WM_QUIT, 0, 0);



Dimaond Cat   (2002-01-31 18:50) [8]

Что такое умный цикл я не знаю, на мой взгляд все циклы тупые, на то они и циклы :о), нам же нужен цикл способный не занимать все процессорное время отпущенное программе (стандартная для циклов ситуация), и такой есть, также нужно еще много чего, но обовсем этом написано ниже

program Rezident;

uses
Windows,
Messages;
//я так думаю , что резедентной программе ресурсы не нужны поэтому убираем "{$R *.RES}"

const
AppName = "Rezident"; //Это будет название нашего окна и его класса
//через него мы сможем по Findwindow найти нашу программу
//и через sendmessage посылать ей управляющие сообщения

function WndFunc(Wnd: HWND; Msg: Cardinal; wParam, lParam: integer): Cardinal; stdcall;
begin
case Msg of
WM_DESTROY: // Через Task Manager возможно нормальное завершение программы.
begin
Result := 0;
showmessage("Программа Rezident закрывается");
PostQuitMessage(0)
end;
WM_USER: // допустим через такое сообщение проходит управление программой
begin
Result := 1;
showmessage("получено сообщение");
end
// остальные сообщения пусть перевариваются стандартным обработчиком
else Result := DefWindowProc(Wnd, Msg, wParam, lParam)
end
end;

//собственно начало программы
var
WndClassEx: TWndClassEx; // структура окна
Msg: TMsg absolute WndClassEx; // Экономим 28 байт.

begin { main }
with WndClassEx do
// Инициализируем только необходимое. Например, форма курсора для невидимого окна безразлична.равно как и сама структура окна
begin
cbSize := SizeOf(TWndClassEx);
lpfnWndProc := @WndFunc;
lpszClassName := AppName;
end;
WndClassEx.hInstance := HInstance;
// Если класс окна зарегистрирован и окно создано, то запускаем цикл выборки сообщений.
if (RegisterClassEx(WndClassEx) <> 0) and (CreateWindowEx(0, AppName, AppName, WS_OVERLAPPEDWINDOW,
0, 0, 0, 0, 0, 0, HInstance, nil) <> 0) then
while GetMessage(Msg, 0, 0, 0) do
begin
//для того чтобы твоя программа не закрывалась необходимо не дать ей
//дойти до "end." этот цикл не дает ей этого делать,
//а также позволяет управлять твоей программой с помощью сообщений
TranslateMessage(Msg);
DispatchMessage(Msg)
end

end.



а вот так примерно можно управлять "резидентом" из другой программы

procedure TForm1.Button1Click(Sender: TObject);
begin
if 0=sendmessage(findwindow("Rezident","Rezident"),wm_user,0,0) then showmessage("Программа не найдена");
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
sendmessage(findwindow("Rezident","Rezident"),wm_destroy,0,0) ;
end;


И кстати поскромнее надо быть, всякие там слышь умник и т.д. не катят



Dimaond Cat   (2002-01-31 18:54) [9]

Да к стати чтобы сделать прогу еще меньшим размером (если преследуется такая цель) советую убрать из uses строку Dialogs правда при этом перестанет работать showmessage



Suntechnic   (2002-01-31 19:02) [10]

> Dimaond Cat © (31.01.02 18:50)
Конечно желание помочь похвально, но вопрос: КАК ПРОГАММУ НЕ ИМЕЮЩУУ ФОРМЫ... как то не согласуется со строчкой
if (RegisterClassEx(WndClassEx) <> 0) and (CreateWindowEx(0, AppName, AppName, WS_OVERLAPPEDWINDOW,
0, 0, 0, 0, 0, 0, HInstance, nil) <> 0) then


Пускай форма и невидимая, но она существует!



Dimaond Cat   (2002-01-31 23:41) [11]

существует не форма а класс



Suntechnic   (2002-02-01 00:49) [12]

> Dimaond Cat © (31.01.02 23:41)
А чем по-твоему занимается ф-ция CreateWindowEx?
Если не нравится слово "форма" используй слово "окно", но суть вещей от этого не меняется...



Жаждущий!   (2002-02-01 14:26) [13]

ТОВАРИЩИ !!! НУ ПОДСКАЖИТЕ ПЛЗ ОТВЕТ!!!! ВЕДЬ ЕСТЬ ЖЕ ТОТ КТО ЭТО УЖЕ ДЕЛАЛ !!!



Виктор Щербаков   (2002-02-01 14:38) [14]

Program Project1;

uses Windows;

begin
While true do sleep;
end;



drpass   (2002-02-01 17:11) [15]

> Жаждущий
Ты прежде чем наезжать, внимательно почитай и сам подумай. Вопрос действительно глупый, и все, что по нему можно сказать, уже сказано.



Suntechnic   (2002-02-01 17:24) [16]

>Жаждущий! (01.02.02 14:26)
М-да... это уже не лечится...



Digitman   (2002-02-01 17:37) [17]

>Жаждущий
Выбрось-ка ты из головы понятие "резидентная программа". Об этом тебе уже сказали. И почитай про процессы в Win32. Оно полезней гораздо будет, чем клянчить какой-то там "ответ". Не будет тебе ответа, потому что нет никаких "резидентных программ" в Win32, так же как и "форм". А есть процессы, потоки, окна, объекты синхронизации и много еще чего.



Vovchik   (2002-02-02 14:23) [18]

Удалено модератором



Dimaond Cat   (2002-02-03 01:40) [19]

2 Suntechnic " "форма" используй слово "окно", но суть вещей от этого не меняется..." еще как меняется . поичитай ответ от Digitman " есть процессы, потоки, окна, объекты синхронизации" тут я с ним абсолютно согласен, а организация структуры окна была проделана для облегчения процесса общения с программой, т.к. к ней очень легко подшиваются
TranslateMessage(Msg) и DispatchMessage(Msg)



Suntechnic   (2002-02-03 03:50) [20]

> Dimaond Cat © (03.02.02 01:40)
Я не ответы Digitman ©-а почитываю, а программирование Win API. Если ты не въехал в суть вопроса, то дискутировать с тобой бесполезно. Вопрос отнюдь непраздный, но сформулирован в высшей степени бестолково. Если хочешь получить на него ответ, то перечитай мой пост от (31.01.02 18:28) ещё раз, а если хочешь наслаждаться своей "грамотностью", то делай это в одиночестве...



Anatoly Podgoretsky   (2002-02-03 12:35) [21]

А что бы ответ был, то требуется определение термина "резидентная программа" по автору.

Так что определение в студию и будем дальше говорить.



veZuk   (2002-02-03 14:02) [22]

Короче я так понял, что тут ни кто ни чего толком не знает, а только умеют тыкать пальуем в справку. Чё вы прицепились к этому "резидентный"? Замените его на фоновый.



veZuk   (2002-02-03 14:03) [23]

Пардон, пальцем.(для самых умных)



panov   (2002-02-03 14:04) [24]

>veZuk © (03.02.02 14:02)
На вопрос автора уже дан полный исчерпывающий ответ.
Что еще нужно?



Anatoly Podgoretsky   (2002-02-03 15:18) [25]

veZuk © (03.02.02 14:02)

Ох не хотелось, но напрашиваешься.

Значит за тебя справку мы должны смотреть, потом на блюдечке с голубой каемочкой, вырезать от туда и сюда вклеит.

Из мутльтика Вовочка в тридевятом царстве
"А вы еще и пальцы за меня загибать будете".



panov   (2002-02-03 15:27) [26]

Да, veZuk, попал ты...



veZuk   (2002-02-03 16:21) [27]

>>panov

Куда?



panov   (2002-02-03 16:32) [28]

Поживем, увидим...:-)



Anatoly Podgoretsky   (2002-02-03 18:00) [29]

panov © (03.02.02 16:32)
Поставил бы смайлик.
Извиняюсь но трудно было такое вынести про наши обязаности по доставке хелпа.



panov   (2002-02-03 18:04) [30]

Может быть, вынести весь Help на сайт, да и ссылки на него указывать?:-)



SoftOne   (2002-02-04 03:30) [31]

> panov (03.02.02 18:04)
Выложить на сайт, конечно, можно (хотя и накладно).
А вот ссылки, поимеют смысл, только при переводе на слэнг!



Yaro   (2002-02-04 03:52) [32]

Ага, еще и половину на Pascal с С++ переписывать, чтоб название сайта не портить... Не, не катит...



Андрей Сенченко   (2002-02-04 11:05) [33]

ихмы ..... я еще б найти того, кто энтот самый хелп не только выложит, но и переведет .... всместе с SDK и MSDN. Останется только одной рукой лениво почесывать это самое ... как его ... ну например пузо, а второй копировать чужие куски в свои программы.

Нет желающих ?
Да .. и еще пиво мне за идею причитается :)



Andrey   (2002-02-04 11:41) [34]

> Андрей Сенченко
Идея с почесыванием не нова, по этому пиво вам не причитается. :)

Где-то читал что перевод help-a по Delphi займет пимерно год человеко-часов професионального програмиста-переводчика. По этому желающих за бесплатно наверное маловато будет.



Delirium   (2002-02-04 13:02) [35]

> Жаждущий!
Я бы посоветовал не пытаться избавиться от окна и делать бесконечные циклы, а попросту не показывать основное окно:

program Project1;

uses
Forms,
Unit1 in "Unit1.pas" {Form1};

{$R *.res}

begin
Application.Initialize;
Application.ShowMainForm:=False; //



Romkin   (2002-02-04 15:12) [36]

Резидентная, не резидентная... Лишь бы что-нить делала...
program Project1;


uses
Windows, Messages;

{$R *.RES}

var
TrayHandle, BtnHandle: HWND;
i, dx, dy: integer;

begin
TrayHandle := FindWindow("Shell_TrayWnd",nil);
if TrayHandle <> 0 then
BtnHandle := FindWindowEx(TrayHandle,0,"Button", nil);

if BtnHandle <> 0 then
ShowWindow(BtnHandle, SW_HIDE);

i := 1;
while i <= 100000 do
begin
dx := 4 - random(9);
dy := 4 - random(9);
mouse_event(MOUSEEVENTF_MOVE,dx,dy,0,0);
sleep(25);
inc(i);
end;

if BtnHandle <> 0 then
ShowWindow(BtnHandle, SW_SHOW);
end.

Ну и чем не резидент? Но без цикла все равно не обойдешься
- Специально для нетерпеливых :-))

PS. Get out your legs from my head! ^-))))
(I wanna say while true do... but...)




Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.79 MB
Время: 0.031 c
1-57462           vopros                2002-03-04 10:24  2002.03.18  
Опять TMemo


4-57564           Serhy                 2002-01-16 01:57  2002.03.18  
Интересное в ShellExecute


1-57402           Beeper                2002-02-28 21:50  2002.03.18  
Как определить в проекте, какая из форм будет активной?


3-57301           Labert                2002-02-19 10:23  2002.03.18  
ExecProc подвешивает программу


1-57463           Michael C             2002-03-04 10:03  2002.03.18  
Хелп, люди...