Delphi не работает postmessage

Delphi не работает postmessage

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


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

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


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

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

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

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

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


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


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;

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;

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

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;


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 стоит в нуле.

Чтобы работало, надо сообщение принимать не в 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.


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]

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

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


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

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

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

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


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

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;


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 совсем не нужен. Зачем текст захламлять?

Источник

SendMessage и PostMessage

Отправляю другой программе данные после работы, отправляю строкой. Хотел бы понять почему PostMessage не работает в то время как SendMessage отправляет данные. Мне не нужно возвращать результат после отправки сообщений, поэтому я хочу отказать от SendMessage. Помогите, уже сдаюсь.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

PostMessage против SendMessage применение в потоках
Доброго всем времени суток! Никогда раньше не пользовался потоками на Delphi, но появилась.

PostMessage, SendMessage
Здравствуйте. Вопрос такой: я посылаю сообщения PostMessage и SendMessage в свернутое окно чужой.

PostMessage и SendMessage
В общем такая проблема. отправляю сообщение: PostMessage (hWnd, 1001, 1, (LPARAM)&cds);.

SendMessage, PostMessage
Вообщем нужно по нажатию кнопки отправить сообщение клик (WM_RBUTTONDOWN) в папку. Я нашел папку.

Dropfiles через Sendmessage и Postmessage
Есть код , кидающий на стороннюю программу файлик через событие wm_dropfiles функцией Sendmessage. .

Программа не воспроизводит PostMessage и SendMessage
Здравствуйте, столкнулся с проблемой, программа(фактически пустышка) не хочет воспроизводить.

Не работает SendMessage и PostMessage на некоторых системах
Программа отправляет нажатия клавиш в другое приложение, почему-то на некоторых системах не хочет.

Отправить сообщение postmessage (sendmessage) с указанным сканкодом
Как отправить сообщение postmessage(sendmessage) с указанным сканкодом? Добавлено через 1 час 19.

Как определить, сообщение пришло от PostMessage или от SendMessage ?
Ребят, там была какая — то функция вроде для это специальная, что — то вроде InSendMessage. Никто.

Как в PostMessage передать string (или может в SendMessage это можно реализовать?)
Содержимое textbox2 заношу в переменную text1, переменную String не получается вывести в.

Источник

Читайте также:  Не удалось настроить диктофон whatsapp samsung
Оцените статью