Форум: "Начинающим";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.013 c