Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-26531
dfgdfgsdg
2003-05-27 21:06
2003.06.09
Как активировать форму?


14-26678
Song
2003-05-24 10:29
2003.06.09
http://coolbaranoff.narod.ru/ :))


11-26420
Vitalon
2002-09-01 18:27
2003.06.09
Помогите разобраться с TKOLRichEdit


8-26620
Terminus
2003-02-25 01:49
2003.06.09
Два вопроса


3-26378
Alex_x
2003-05-20 16:59
2003.06.09
Медленный переход на первую запись в базе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский