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 не получается вывести в.
Источник