Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

PostMessage [D5, D7]


Страницы:   1 2

GanibalLector ©   (2005-12-08 16:03:00) 

в DLL:

 Msg:=RegisterWindowMessage(PChar('Cash_1'));
 for i:=1 to 100 do
 begin
   ...
    SendMessage(HWND_BROADCAST,Msg,tProc,tProc);
   ...

в приложении

procedure TForm1.WndProc(var Message: TMessage);
begin
  if Message.Msg = h then
 begin
   ProgressBar1.Position :=Message.WParam;
 end else
 inherited WndProc(Message);
end;


Все чудесно работает,НО!!! Мне надо посылать через PostMessageв силу некоторых причин.Посылаю и  не доходит: ( Как быть???


evvcom   (2005-12-09 10:13:00) [1]


> 2 Lamer@fools.ua ©   (09.12.05 00:01) [18]
> >почему в DLL функция Test — register, а в приложении —
> sdtcall?
> В спешке писал ;) в DLL читать как sdtcall.

Кстати, в данном случае пофиг (нет параметров), поэтому ошибку не получишь. Но дисциплинировать себя надо.

Давно хочу заметить, что здесь
> RegisterWindowMessage(PChar('Cash_1'));
PChar совсем не нужен. Зачем текст захламлять?


Digitman   (2005-12-09 09:03:00) [2]


> почему-же тоже самое не работает из DLL


тело Test() пошагово трассировал ?


GanibalLector   (2005-12-09 01:44:00) [3]

Блин,ну фигня получается. Создал приложение с таким вот кодом:

procedure TForm1.Button1Click(Sender: TObject);
var h,i:Cardinal;
begin
 h:=RegisterWindowMessage('Cash_1');
 for i:=1 to 100 do
 begin
   PostMessage(HWND_BROADCAST,h,i,i);
   Sleep(50);
 end;
 PostMessage(HWND_BROADCAST,h,0,0);
end;

Все работает. Так почему-же тоже самое не работает из DLL в [17]???


GanibalLector   (2005-12-09 00:08:00) [4]

2 Lamer@fools.ua ©   (09.12.05 00:01) [18]
>почему в DLL функция Test — register, а в приложении — sdtcall?
В спешке писал ;) в DLL читать как sdtcall.


Lamer@fools.ua   (2005-12-09 00:01:00) [5]

Кстати, почему в DLL функция Test — register, а в приложении — sdtcall?


GanibalLector   (2005-12-08 23:52:00) [6]

2 umbra ©   (08.12.05 19:19) [10]
Чтобы работало, надо сообщение принимать не в WndProc, а в Application.OnMessage

Что-то не работает и в Application.OnMessage. Сделал так :

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   ProgressBar1: TProgressBar;
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   Msg:Cardinal;
   procedure AppMessage(var M: TMsg; var Handled: Boolean);
 public
 end;

var Form1: TForm1;
const DLLName='Project1.dll';
implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Msg:=RegisterWindowMessage(PChar('Cash_1'));
 Application.OnMessage := AppMessage;
end;

procedure TForm1.Button1Click(Sender: TObject);
var hDLL:THandle;
Test: procedure;stdcall;
begin
  hDLL:=LoadLibrary(DLLName);
  if hDLL>0 then
  begin
    Test:=GetProcAddress(hDLL,'Test');
    if Assigned(Test) then Test;
  end;
end;

procedure TForm1.AppMessage(var M: TMsg; var Handled: Boolean);
begin
 if M.message=Msg then
  ProgressBar1.Position :=M.WParam;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Application.OnMessage := nil;
end;

end.


Lamer@fools.ua   (2005-12-08 22:06:00) [7]

>> palva ©   (08.12.05 21:56) [15]

А если у меня нет времени? Ку?


palva   (2005-12-08 21:56:00) [8]

> А во-вторых, мне не всегда интересно компилировать чужой код из форума
А если в чужом коде вирус? А?


Lamer@fools.ua   (2005-12-08 21:19:00) [9]

>> GanibalLector ©   (08.12.05 19:18) [9]

> А зачем гадать? Скомпилируй и посмотри ;)
У меня нет Delphi на работе. Это во-первых. А во-вторых, мне не всегда интересно компилировать чужой код из форума. Даже если есть желание помочь разобраться с проблемой.


Leonid Troyanovsky   (2005-12-08 19:38:00) [10]


> umbra ©   (08.12.05 19:33) [12]

> ну, у окна очередь как бы есть, но она не успевает разрастись


"Как бы" не принимается.
Читать Джефа Рихтера, на него я сегодня уже ссылался.

--
Regards, LVT.


umbra   (2005-12-08 19:33:00) [11]

2 Leonid Troyanovsky ©   (08.12.05 19:25) [11]

ну, у окна очередь как бы есть, но она не успевает разрастись
WndProc не дремлет  :)


Leonid Troyanovsky   (2005-12-08 19:25:00) [12]


> umbra ©   (08.12.05 19:19) [10]
> в Application.OnMessage, поскольку PostMessage помещает
> сообщение не в очередь окна, а в очередь потока


Собс-но, у окна нет очередей, они у потока.
See also PostThreadMessage.

Но, это так, remark only.

--
Regards, LVT.


umbra   (2005-12-08 19:19:00) [13]

Чтобы работало, надо сообщение принимать не в WndProc, а в Application.OnMessage, поскольку PostMessageпомещает сообщение не в очередь окна, а в очередь потока


GanibalLector   (2005-12-08 19:18:00) [14]

2 Lamer@fools.ua ©   (08.12.05 19:10) [8]
>Попробую угадать. ProgressBar.Position не принимает промежуточные значения, а сразу становится, как при Position = 100?

А зачем гадать? Скомпилируй и посмотри ;) А вообще,ты не угадал ProgressBar.Position стоит в нуле.


Lamer@fools.ua   (2005-12-08 19:10:00) [15]

>> GanibalLector ©   (08.12.05 18:59) [7]

> при замене на PostMessage не работает
Попробую угадать. ProgressBar.Position не принимает промежуточные значения, а сразу становится, как при Position = 100?

> Да. Тестирую в однопоточном.
Вот когда будет многопоточное, тогда и будут, возможно, доходить PostMessage'и. А сейчас они в очереди ждут, судя по всему.


GanibalLector   (2005-12-08 18:59:00) [16]

2 Digitman ©   (08.12.05 16:49) [5]

>сабж - собственно в вопросе
>в раскрытии контекста вопроса
Не понять мне Вас умом. Что это???

2 Lamer@fools.ua ©   (08.12.05 16:51) [6]
Да. Тестирую в однопоточном.

В виду непоняток в [1] и [3] привожу полный код:

library Project1;

uses
 SysUtils,Classes,Windows;

procedure Test;
var Msg,I:Cardinal;
begin
 Msg:=RegisterWindowMessage(PChar('Cash_1'));
 for i:=1 to 100 do
 begin
    SendMessage(HWND_BROADCAST,Msg,i,i); // при замене на PostMessage не работает
   Sleep(30);
 end;
 SendMessage(HWND_BROADCAST,Msg,0,0);
end;

Exports
Test;

{$R *.res}

begin
end.



unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, StdCtrls;
type
 TForm1 = class(TForm)
   ProgressBar1: TProgressBar;
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   Msg:Cardinal;
   { Private declarations }
 public
   { Public declarations }
 protected
   procedure WndProc(var Message: TMessage); override;
 end;

var Form1: TForm1;
const DLLName='Project1.dll';
implementation
{$R *.dfm}

procedure TForm1.WndProc(var Message: TMessage);
begin
 if Message.Msg = Msg
  then ProgressBar1.Position :=Message.WParam
  else inherited WndProc(Message);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Msg:=RegisterWindowMessage(PChar('Cash_1'));
end;

procedure TForm1.Button1Click(Sender: TObject);
var hDLL:THandle;
Test: procedure;stdcall;
begin
  hDLL:=LoadLibrary(DLLName);
  if hDLL>0 then
  begin
    Test:=GetProcAddress(hDLL,'Test');
    if Assigned(Test) then Test;
  end;
end;

end.


Lamer@fools.ua   (2005-12-08 16:51:00) [17]

> GanibalLector ©

Приложение многопоточное?


Digitman   (2005-12-08 16:49:00) [18]


> PostMessage


сабж - собственно в вопросе


> SendMessage


в раскрытии контекста вопроса

"Как понимать тебя, Саид ?" (С) Черный Абдула


GanibalLector   (2005-12-08 16:46:00) [19]

>Что такое в приложении h?
h:=RegisterWindowMessage(PChar('Cash_1'));


evvcom   (2005-12-08 16:44:00) [20]

А где из кода видно, что должно доходить? Что такое в приложении h? Точнее чему равно?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо