Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1133968311
kop
2005-12-07 18:11
2005.12.25
Что делаю не так?


2-1133938393
Sung
2005-12-07 09:53
2005.12.25
Условное описание


5-1118752459
tyo
2005-06-14 16:34
2005.12.25
CheckListBox c 3 состояниями


14-1133370769
Sun bittern
2005-11-30 20:12
2005.12.25
Поиск файлов "Win+F" <> "FindFirst" <> "FindFirstFile"


5-1118605866
Владимир
2005-06-12 23:51
2005.12.25
Выделение элемента дерева правой кнопкой мыши





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский