Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

PostMessage   Найти похожие ветки 

 
GanibalLector ©   (2005-12-08 16:03) [0]

в 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 в силу некоторых причин.Посылаю и  не доходит: ( Как быть???


 
umbra ©   (2005-12-08 16:36) [1]

а что такое tProc? если указатель, то в мсдн про PostMessage прямо написано не передавать в параметрах сообщения указателей


 
GanibalLector ©   (2005-12-08 16:44) [2]

нет.tProc -Integer.


 
evvcom ©   (2005-12-08 16:44) [3]

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


 
GanibalLector ©   (2005-12-08 16:46) [4]

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


 
Digitman ©   (2005-12-08 16:49) [5]


> PostMessage


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


> SendMessage


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

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


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

>GanibalLector ©

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


 
GanibalLector ©   (2005-12-08 18:59) [7]

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 19:10) [8]

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

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

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


 
GanibalLector ©   (2005-12-08 19:18) [9]

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

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


 
umbra ©   (2005-12-08 19:19) [10]

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


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


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


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

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

--
Regards, LVT.


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

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

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


 
Leonid Troyanovsky ©   (2005-12-08 19:38) [13]


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

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


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

--
Regards, LVT.


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

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

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


 
palva ©   (2005-12-08 21:56) [15]

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


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

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

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


 
GanibalLector ©   (2005-12-08 23:52) [17]

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-09 00:01) [18]

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


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

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


 
GanibalLector ©   (2005-12-09 01:44) [20]

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

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]???


 
Digitman ©   (2005-12-09 09:03) [21]


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


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


 
evvcom ©   (2005-12-09 10:13) [22]


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.066 c
2-1134319884
apxi
2005-12-11 19:51
2005.12.25
Как связать 2 таблицы в Access с помощью запроса?


2-1134152414
pussycat
2005-12-09 21:20
2005.12.25
Копирование файла


2-1133935201
Fedpavel
2005-12-07 09:00
2005.12.25
_Recordset


6-1126678729
IHusak
2005-09-14 10:18
2005.12.25
SQL сервер


14-1133531149
Александр Иванов
2005-12-02 16:45
2005.12.25
Год спустя...