Форум: "WinAPI";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c