Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

За 2004-03-12

Re[4]: [D5] GetDС + память + RePaint

Здарова, -=BorMaN=-!

12 марта 2004 г., пятница, 02:04:06 (GMT+05:00), ты намылил:

B> 4) Как указать окну на котором рисуешь то что пора перерисоваться?
МГ>>> InvalidateRect(handel,@rect,true);

Томилов>> Угу, понятно. Только либо мерцает сильно, либо не работает - я так
понял
Томилов>> перерисовываются либо все окна (handle = 0), либо окна не обращают
на
Томилов>> InvalidateRect внимания.
B> Поствь вместо TRUE FALSE - будет меньше мигать ;-)
B> True перерисовывает ВСЕ окно с подложкой...

Я это уже пробовал - ноль эмоций.

--
Никогда больше не буду говорить афоризмами. Да, кстати, запишите мою последнюю
фразу

   Томилов Александр 2004-03-12 23:26:46 (#101746)

Re[3]: Cpp Builder | Delphi WinExec

Здарова, -=BorMaN=-!

11 марта 2004 г., четверг, 22:50:37 (GMT+05:00), ты намылил:

Surin_bp>> Тема: Cpp Builder | Delphi WinExec
>>> Есть такая API'шная функция
>>> UINT WinExec(LPCSTR lpCmdLine, // address of command line
>>> UINT uCmdShow // window style for new application
Surin_bp>> Всегда лучше использовать CreateProcess - не
Surin_bp>> интересовался в Builder'e, но в
Surin_bp>> Delphi все равно идет вызов CreateProcess

Вот код WinExec:
function WinExec; external kernel32 name 'WinExec';

Вот цитата из хелпа:
The CreateProcess function is used to run a new program.
The WinExec and LoadModule functions are still available,
but they are implemented as calls to CreateProcess.

Складываем 2 + 2, получаем что WinExec - функция API в которой
вызывается CreateProcess - так же функция API, т.е. WinExec и на
ассемблере будет вызывать CreateProcess.

B> Говорят, что прога, загруженная через CreateProcess может закрится при закрытии
B> запустившей ее проги... Это так?

Держи прогу с помощью которой я запускаю Bat + MyGate (кривовата
прога, но работает):

program RunBat;
uses
Windows, Messages;
var hProcess: THandle;

function RunAppAndWait(CmdLine, WorkDir: string; Wait: boolean): THandle;
var SI: TStartupInfo;
PI : TProcessInformation;
Bool: boolean;
begin
Result := 0;
ZeroMemory(@SI, SizeOf(SI));
SI.cb := SizeOf(SI);
if not Wait then
begin
SI.dwFlags := STARTF_USESHOWWINDOW;
SI.wShowWindow := SW_SHOWMINNOACTIVE;
end;
Bool := CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0,
nil, PChar(WorkDir), SI, PI);
if Bool then
begin
CloseHandle(PI.hThread);
if Wait then WaitForSingleObject(PI.hProcess, INFINITE);
Result := PI.dwProcessId;
CloseHandle(PI.hProcess)
end;
end;

begin
hProcess := RunAppAndWait('C:\Program Files\MyGate\MyGate.exe', 'C:\Program
Files\MyGate', false);
RunAppAndWait('C:\Program Files\The Bat!\thebat.exe', 'C:\Program Files\The
Bat!', true);
TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS,false,hProcess),1);
end.

B> И еще, WinExec - API'шная функция (т.е. ее можно юзать "везде") В чем же все-таки
B> проблемма в Cpp?

Delphi 5:
procedure TForm1.Button1Click(Sender: TObject);
begin
WinExec('c:\winnt\notepad.exe', SW_SHOW);
end;

Builder 5:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WinExec("c:\\winnt\\notepad.exe", SW_SHOW);
}

Или так:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
char* CmdLine1;
CmdLine1 = "c:\\winnt\\notepad.exe";
WinExec(CmdLine1, SW_SHOW);
}

Ничего не глючит. Приведи свой код - станет понятней.

PS: Кстати в Delphi можно так:

Bool := CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0,
^^^ ^^^^^^^^^^^^^^
nil, PChar(WorkDir), SI, PI);

и так:

Bool := CreateProcess(PChar(CmdLine), nil, nil, nil, false, 0,
^^^^^^^^^^^^^^ ^^^
nil, PChar(WorkDir), SI, PI);

А в Buildere можно только так:

Bool = CreateProcess(CmdLine1, "", NULL, NULL, false, 0,
^^^^^^^^ ^^
NULL, WorkDir, &SI, &PI);

А вот так не запускается CmdLine1:

Bool = CreateProcess("", CmdLine1, NULL, NULL, false, 0,
^^ ^^^^^^^^
NULL, WorkDir, &SI, &PI);

т.е. одна и та же API вызывается по разному?

--
Никогда больше не буду говорить афоризмами. Да, кстати, запишите мою последнюю
фразу

   Томилов Александр 2004-03-12 23:26:40 (#101745)

Re: Вобще не по теме, но может кто поможет ???

On Fri, Mar 12, 2004 at 01:15:31PM +0400, Gift wrote:
> Люди как правильно раскуривать трубку и ее курить???

Так как это письмо абсолютно не по теме, то его автор поставлен на
премодерацию. Если подобное повторится, то он вообще будет переведен в
readonly.

P.S. Просьба на подобные письма не отвечать, т.к. за это тоже буду
наказывать.

   2004-03-12 21:48:39 (#101698)

Re: Clipboard [Delphi6] [Win9x]

> Тема: Clipboard [Delphi6] [Win9x]

Здравствуйте!

> Есть объект TClipboard (CLIPBRD.PAS).
> В нем есть методы SetTextBuf и GetTextBuf для помещения и чтения
> текстовой информации
> Или еще проще с помощью свойства AsText:
> AsText:='Гыр-гыр' догадайся, что делает :))

Спасибо! Всё получилось!
Пока!
С уважением Lakmus
http://www.nvkz.kuzbass.net/lakmus
Номер выпуска : 2555
Возраст листа : 172 (дней)
Количество подписчиков : 378
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/101435
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

   2004-03-12 15:44:55 (#101435)

Re[3]: [Delphi6] закрыть message box

Здравствуйте, keel.

Вот реально работающий пример. Думаю, разберёшься.

var
Form1: TForm1;
g_szCaption: PCHAR;
g_nSecLeft: integer;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);
var hWnd : THANDLE;
begin
hWnd := FindWindow(nil, g_szCaption);
if hWnd <> 0 then
begin
dec(g_nSecLeft);
if g_nSecLeft = 0 then
EndDialog(hWnd, IDOK);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
g_nSecLeft := 2;
g_szCaption := 'Мой MessageBox.';
Timer1.Enabled := true;
MessageBox(handle,'Закроется через 2 сек.',g_szCaption, 0);
end;

   Пастернак Сергей 2004-03-12 15:08:08 (#101397)

Re[3]: Cpp Builder | Delphi WinExec

Здравствуйте, -=BorMaN=-.

Вы писали 11 марта 2004 г., 19:50:37:

B> Говорят, что прога, загруженная через CreateProcess может закрится при закрытии
B> запустившей ее проги... Это так?

Программа, загруженная через CreateProcess, может быть закрыта программой
запустившей её, только, если эта программа (вызвавшая CreateProcess) специально
того захочет, т.е. вызовет TerminateProcess, передав функции в качестве
описателя процеса (HANDLE) описатель загруженной программы. Например,
при закрытии Fara программы запущенные им автоматически не выгружаются.

B> И еще, WinExec - API'шная функция (т.е. ее можно юзать "везде")
B> В чем же все-таки проблемма в Cpp?

В MSDN по этому поводу сказано:
Note This function is provided only for compatibility with 16-bit Windows.
Applications should use the CreateProcess function.
Тем более, что WinExec, если я не ошибаюсь, всё равно вызывает
CreateProcess. С этой функцией у меня ни в Cpp ни в Delphi проблем не
было.

А вообще, если хочешь в этом разобраться, почитай Джефри Рихтера "Windows
для проффесионалов".

   Пастернак Сергей 2004-03-12 15:07:31 (#101396)

Re: Вобще не по теме, но может кто поможет ???

Тема: Вобще не по теме, но может кто поможет ???
> Люди как правильно раскуривать трубку и ее курить???
> А то вот подарили+табак Clan а как раскуривать не сказали.
Абсолютно правильно будет бросить курить :))

   2004-03-12 14:19:07 (#101359)

Re[3]: Cpp Builder | Delphi WinExec

>> Говорят, что прога, загруженная через CreateProcess может закрится при закрытии
>> запустившей ее проги... Это так?
> Специально не проверял - вроде задач таких не было. Но судя по описанию, проблемой
> является подождать, пока этот новый процесс не завершится. Рекомендуется после
> создания процесса закрыть его дескрипторы с помощью CloseHandle. Иначе он остается
> в памяти пока его потоки не завершатся и дескрипотры не будут закрыты.
> Наверно, чтоб не закрылся с закрытием родиельского, стоит не наследовать дескрипотры
> родительские:
> lpInheritHandles = FALSE, а dwCreationFlags = CREATE_NEW_CONSOLE (создается
процесс
> со своим окном)
>
Кажется, просьба читать документацию превращается в глас вопиющего в пустыне.
Хотя, чем черт не шутит, может кого-нибудь проймет.

Во-первых, мало ли что говорят. Люди склонны заблуждаться. Если не предпринимать
дополнительных усилий, порожденный процесс не завершится
при завершении родительского.
Во-вторых, признак наследования дескрипторов определяет, будут ли в порожденном
процессе доступны дескрипторы открытых объектов (с теми же значениями и
правами доступа). К заданному вопросу он не имеет никакого отношения.
В-третьих, CREATE_NEW_CONSOLE заставляет создать отдельную
консоль для порожденного процесса, а не отдельное окно. Это
разные вещи - окна могут создаваться только явно.
В-четвертых, закрывать дескрипторы из структуры PROCESS_INFORMATION
после вызова CreateProcess действительно необходимо. Иначе, даже
если порожденный процесс завершится, объект процесса будет
существовать до завершения родительского процесса (хотя
большая часть ресурсов, использованных потомком,
все-таки будет освобождена). Дескриптор порожденного процесса
может понадобиться разве что для ожидания его завершения
(с помощью WaitForSingleObject), а в большинстве
случаев его можно закрыть сразу.

>> И еще, WinExec - API'шная функция (т.е. ее можно юзать "везде") В чем же все-таки
>> проблемма в Cpp?
> WinExec все равно реализована через CreateProcess.
Это так. Причем, судя по документации, реализована очень просто.
А раз функция API не работает именно при использовании конкретной
среды разработки (в данном случае C++ Builder), есть смысл
посмотреть на свои исходники и файлы заголовков -
нет ли там каких тонкостей.
Номер выпуска : 2551
Возраст листа : 172 (дней)
Количество подписчиков : 378
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/101337
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

   2004-03-12 13:39:27 (#101337)

Вобще не по теме, но может кто поможет ???

Привет всем.
Люди как правильно раскуривать трубку и ее курить???
А то вот подарили+табак Clan а как раскуривать не сказали.
Пока.
Номер выпуска : 2550
Возраст листа : 172 (дней)
Количество подписчиков : 378
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/101274
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

   2004-03-12 12:09:13 (#101274)

Re[4]: [Delphi6] закрыть message box

Здравствуйте Вадим,

Friday, March 12, 2004, 12:25:11 AM, вы писали:

ВШ> Я следил за этой дискуссией и хочу сделать пару замечаний.
ВШ> 1. Тяжело представить такую ситуацию, когда сама программа должна сама
ВШ> "погасить" свое же окно с информацией о внештатной ситуации - ведь
ВШ> именно такая ситуация предпологает выдачу окна-мессидж. Если не
ВШ> секрет, раскажи, зачем это надо? Может, твою проблему можно решить
ВШ> более простым путем, без использования таких заморочек.
ВШ> 2. Насколько я в курсе, хендлы месидж-окон не находятся ни функцией
ВШ> FindWindow (не знаю, как насчет других функций поиска хендлов), ни
ВШ> WinSight-ом. Удивлен, как тебе удалось откопать его в WinSight-е.
ВШ> Ты спрашивал, постоянно ли это значение. Ответ - нет, поскольку хендл
ВШ> - это своего рода порядковый номер окна в ОС. Запусти другое
ВШ> количество программ или даже в другом порядке, и ты увидешь, что
ВШ> одному и тому же окну соответствуют разные значения его хендлов в
ВШ> разных сеансах. То есть, жестко привязаться к одному числу нельзя.
ВШ> Потому, я либо за пересмотр самой идеи закрытия своего же месидж-окна
ВШ> (например, смастери собственное окно, или вообще откажись от такого
ВШ> сценария), либо нужно таки топать по принципу, описанному выше.

Вообще моя цель - убрать nag screen из моей программки, он появляется
при нажатии на кнопку.
Помогите пожалуйста, ибо работа стоит!

   2004-03-12 11:21:35 (#101242)

Re[3]: Cpp Builder | Delphi WinExec

"-=BorMaN=-" ты не прав

Тема: Re[2]: Cpp Builder | Delphi WinExec
> Говорят, что прога, загруженная через CreateProcess может закрится при закрытии
> запустившей ее проги... Это так?
Специально не проверял - вроде задач таких не было. Но судя по описанию, проблемой
является подождать, пока этот новый процесс не завершиться. Рекомендуется после
создания процесса закрыть его дескрипторы с помощью CloseHandle. Иначе он остается
в памяти пока его потоки не завершатся и дескрипотры не будут закрыты.
Наверно, чтоб не закрылся с закрытием родиельского, стоит не наследовать дескрипотры
родительские:
lpInheritHandles = FALSE, а dwCreationFlags = CREATE_NEW_CONSOLE (создается процесс
со своим окном)

> И еще, WinExec - API'шная функция (т.е. ее можно юзать "везде") В чем же все-таки
> проблемма в Cpp?
WinExec все равно реализована через CreateProcess - посмотри исходники хотя бы,
да и в хороших книгах об этом есть. (Этот факт обычно отмечают в разделе CreateProcess).
Да и сохраняется только для совместимости с ранними (!) версиями Windows (!!)

   2004-03-12 08:19:59 (#101152)

Re[3]: [D5] GetDС + память + RePaint

Здарова!

10 марта 2004 г., среда, 23:20:18 (GMT+05:00):

>>> 1) Почему перекрываются адреса переменных PChar?
МГ>> Pcahr - это нультерменальные строки, для них нужно выделять память!
МГ>> (new(PCHAR);)

Этот вопрос решен - Surin_bp на личный кинул:

S> var
S>    str : array [1..255] of char;

S> и ставь эту STR в то место, где требуется 
S> PChar. VAR в 32-разрядном и выделяет место. А от New какая польза? Впрочем,
если
S> не то написал, то пришли примерчик того, что хочешь сделать

PS: Все остальные вопросы в силе - первое письмо лежит тут:
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/99956

   Томилов Александр 2004-03-12 04:13:38 (#101125)

Re[3]: [Delphi6] закрыть message box

Д>> procedure PressKey (key : integer);
Д>> begin
Д>> keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
Д>> keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
Д>> keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
Д>> end;

Д>> procedure TForm1.Button1Click(Sender: TObject);
Д>> begin
Д>> ShowMessage('Hello');
Д>> PressKey (VK_ENTER);
Д>> end;

Д>> З.Ы. Сам не пробовал, по памяти писал. Если не будет работать, пиши.

k> Не получается у меня чего-то, пишет при PressKey (VK_ENTER); что мол
k> несоответствие переменных(
k> И это работать не будет в том смысле что PressKey (VK_ENTER);
k> выполнится только после того как message box будет закрыт.
А ежели так:

Д>> procedure TForm1.Button1Click(Sender: TObject);
Д>> begin
Д>> ShowMessage('Hello');
Д>> keybd_event(vk_Enter, 0, 0, 0); //!!!! без вызова процедуры
Д>> end;
Попробуй также с параметром KEYEVENTF_KEYUP.
Я следил за этой дискуссией и хочу сделать пару замечаний.
1. Тяжело представить такую ситуацию, когда сама программа должна сама
"погасить" свое же окно с информацией о внештатной ситуации - ведь
именно такая ситуация предпологает выдачу окна-мессидж. Если не
секрет, раскажи, зачем это надо? Может, твою проблему можно решить
более простым путем, без использования таких заморочек.
2. Насколько я в курсе, хендлы месидж-окон не находятся ни функцией
FindWindow (не знаю, как насчет других функций поиска хендлов), ни
WinSight-ом. Удивлен, как тебе удалось откопать его в WinSight-е.
Ты спрашивал, постоянно ли это значение. Ответ - нет, поскольку хендл
- это своего рода порядковый номер окна в ОС. Запусти другое
количество программ или даже в другом порядке, и ты увидешь, что
одному и тому же окну соответствуют разные значения его хендлов в
разных сеансах. То есть, жестко привязаться к одному числу нельзя.
Потому, я либо за пересмотр самой идеи закрытия своего же месидж-окна
(например, смастери собственное окно, или вообще откажись от такого
сценария), либо нужно таки топать по принципу, описанному выше.

   Вадим Шешунов 2004-03-12 01:41:00 (#101100)

Re: [Delphi6] закрыть message box

==-==-=-Привета!Да напиши ты свое подобие МессагБокса да и все - меньше гемора будет :-)

   -=BorMaN=- 2004-03-12 01:38:46 (#101099)
  • 1
  • 2