Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.09;
Скачать: CL | DM;

Вниз

SendMessage. Не работает текст. обмен между процессами   Найти похожие ветки 

 
Codex ©   (2003-04-11 16:59) [0]

Всем привет!

Мастера, помогите!

Создаю окно вручную и привязываю к нему с помощью SetWindowLong
эту процедуру. Все прекрасно работает до тех пор, пока из этой не требуется по запросу WM_User+1 послать текстовую строку (по аналогии с WM_GETTEXT).

Пример работает, если сообщение посылается из текущего процесса, в противном случае программа вылетает из блока try (см. ниже). GetLastError, как ни странно, возвращает 0.


function WndProc(wnd:Hwnd;Msg:Uint;w:WParam;l:Lparam):LRESULT; stdcall;
var
S:string;
...
...
if Msg=WM_USER+1 then
begin

S:="Privet;
try
Result := StrLen(StrLCopy(PChar(W), Pchar(S), 6);
except
Err:=GetLastError; //Err равно 0
end;
end;
end;


Также следует отметить, что сообщение посылается в виде

var
P:Pchar;
begin
P:=StrAlloc(100);

SendMessage(H,WParam(P),99);

end;


Заранее всем спасибо.


 
MBo ©   (2003-04-11 17:01) [1]

Ты выделяешь память в адресном пространстве одного процесса, а в другом этот адрес не имеет смысла.
Воспользуйся WM_COPYDATA


 
Codex ©   (2003-04-11 17:05) [2]

Хм, спасибо. Щаз попробую


 
Codex ©   (2003-04-11 17:19) [3]

Как выяснилось из SDK, данные передаются тому, кто принимает сообщение WM_COPYDATA, здесь же ситуация, когда необходимо возвратить данные посылающему сообщение. А насчет выделения памяти - как-то ведь работают WM_GETTEXT и WM_SETTEXT.


 
Diamond Cat ©   (2003-04-11 17:36) [4]


> как-то ведь работают WM_GETTEXT и WM_SETTEXT.

работают но надо выделять адрес в памяти по особому если другому потоку, а если своему то никаких проблем вообще нет


 
Codex ©   (2003-04-11 17:42) [5]



> работают но надо выделять адрес в памяти по особому если
> другому потоку, а если своему то никаких проблем вообще
> нет


Эта функция работает со всеми окнами без дополнительных особых способов.

function GetWinText (hWnd : LongInt) : string;
var
PC : PChar;
L : integer;
begin
Result:="";
L:=SendMessage (hWnd, WM_GETTEXTLENGTH, 0, 0);
if L>2000000 then L:=100;
if L=0 then exit;
getmem (PC, L+1);
SendMessage (hWnd, WM_GETTEXT, L+1, LongInt (PC));
result:=PC;
FreeMem(PC,L+1);
end;</CODE



 
MBo ©   (2003-04-11 17:48) [6]

>необходимо возвратить данные посылающему сообщение
та к ты ему в ответ пошли WM_COPYDATA

WM_GETTEXT и некоторые другие сообщения (например, получение строки ListBox) работают так для совместимости со старыми программами - скрыто выделяется память, доступная обоим процессам, через нее и идет обмен.
Так же действует и WM_COPYDATA (через Memory-Mapped File, AFAIK)


 
Codex ©   (2003-04-11 17:53) [7]


> так ты ему в ответ пошли WM_COPYDATA

Да, но, к сожалению, это не элегантно. К тому же ему нужно для этой операции специально создавать окно. Может есть другой способ? Кстати, можно ли создать этот Memory-Mapped File вручную?


 
Codex ©   (2003-04-11 17:56) [8]

может через CreateFileMapping....


 
MBo ©   (2003-04-11 18:00) [9]

>может через CreateFileMapping
ну да


 
Diamond Cat ©   (2003-04-11 18:06) [10]

попробуй также с wm_settext :)


 
Codex ©   (2003-04-11 18:09) [11]


> попробуй также с wm_settext :)

Ага, только для этого нужно создавать дополнительное окно :)


 
Scorp   (2003-04-11 18:32) [12]

Значит так: опытом многих гуру и временем было доказано (ух, сколько об этом уже говорилось) - для обмена данными между процессами используєтся MappingFile. Народ, читайте Рихтера!


 
Codex ©   (2003-04-11 18:41) [13]

Ушел читать Рихтера... :)


 
Diamond Cat ©   (2003-04-11 22:49) [14]


> Ага, только для этого нужно создавать дополнительное окно
> :)

причем тут дополнительное окно?


 
Cobalt ©   (2003-04-12 00:18) [15]

А вместо оконных сообщений использовать events/mutex/semaphores на выбор.
Подробнее читать об этом в Interprocess Synchronization



Страницы: 1 вся ветка

Текущий архив: 2003.06.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
14-26753
bushmen
2003-05-22 10:31
2003.06.09
Delphi i cache


3-26367
Sunny
2003-05-21 08:01
2003.06.09
Отсутствует уникальный ключ


1-26531
dfgdfgsdg
2003-05-27 21:06
2003.06.09
Как активировать форму?


9-26318
Fuylan
2002-12-30 01:42
2003.06.09
OpenGL


3-26404
Alexey
2003-05-21 16:31
2003.06.09
Фильтр