![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SendMessage. Не работает текст. обмен ;между процессами [D5, Win2k]
Codex © (2003-04-11 16:59:00)Всем привет!
Мастера, помогите!
Создаю окно вручную и привязываю к нему с помощью 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;
Заранее всем спасибо.
Cobalt (2003-04-12 00:18:00) [1]А вместо оконных сообщений использовать events/mutex/semaphores на выбор.
Подробнее читать об этом в Interprocess Synchronization
Diamond Cat (2003-04-11 22:49:00) [2]
> Ага, только для этого нужно создавать дополнительное окно
> :)
причем тут дополнительное окно?
Codex (2003-04-11 18:41:00) [3]Ушел читать Рихтера... :)
Scorp (2003-04-11 18:32:00) [4]Значит так: опытом многих гуру и временем было доказано (ух, сколько об этом уже говорилось) - для обмена данными между процессами используєтся MappingFile. Народ, читайте Рихтера!
Codex (2003-04-11 18:09:00) [5]
> попробуй также с wm_settext :)
Ага, только для этого нужно создавать дополнительное окно :)
Diamond Cat (2003-04-11 18:06:00) [6]попробуй также с wm_settext :)
MBo (2003-04-11 18:00:00) [7]>может через CreateFileMapping
ну да
Codex (2003-04-11 17:56:00) [8]может через CreateFileMapping....
Codex (2003-04-11 17:53:00) [9]
> так ты ему в ответ пошли WM_COPYDATA
Да, но, к сожалению, это не элегантно. К тому же емунужно для этой операции специально создавать окно. Может есть другой способ? Кстати, можно ли создать этот Memory-Mapped File вручную?
MBo (2003-04-11 17:48:00) [10]>необходимо возвратить данные посылающему сообщение
та к ты ему в ответ пошли WM_COPYDATA
WM_GETTEXT и некоторые другие сообщения (например, получение строки ListBox) работают так для совместимости со старыми программами - скрыто выделяется память, доступная обоим процессам, через нее и идет обмен.
Так же действует и WM_COPYDATA (через Memory-Mapped File, AFAIK)
Codex (2003-04-11 17:42:00) [11]
> работают но надо выделять адрес в памяти по особому если
> другому потоку, а если своему то никаких проблем вообще
> нет
Эта функция работает со всеми окнами без дополнительных особыхспособов.
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
Diamond Cat (2003-04-11 17:36:00) [12]
> как-то ведь работают WM_GETTEXT и WM_SETTEXT.
работают но надо выделять адрес в памяти по особому если другому потоку, а если своему то никаких проблем вообще нет
Codex (2003-04-11 17:19:00) [13]Как выяснилось из SDK, данные передаются тому, кто принимаетсообщение WM_COPYDATA, здесь же ситуация, когда необходимо возвратить данные посылающемусообщение. А насчет выделения памяти - как-то ведь работают WM_GETTEXT и WM_SETTEXT.
Codex (2003-04-11 17:05:00) [14]Хм, спасибо. Щаз попробую
MBo (2003-04-11 17:01:00) [15]Ты выделяешь память в адресном пространстве одного процесса, а в другом этот адрес не имеет смысла.
Воспользуйся WM_COPYDATA