![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PostMessage [D5, D7]
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? Точнее чему равно?