Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Строка через Message [D6, WinXP]


Страницы:   1 2

ricks ©   (2002-06-18 00:34:00) 

Есть две программы, и нужно из одной переслать в другую какую-либо строку, как это сделать, если при
SendMessage("Program2".Handle, WM_USER+N, LongInt(PChar("Some string"), 0)
вторая программа получает, извиняюсь за выражение, хто-зна-шо ;-)


jedi   (2002-06-30 20:47:00) [1]

Юрий Зотов ©:
Ya potoropilsea, sorry.
desvitel"no ya ne stal provereat" pri otsilke v drugoi protses, prosto vspomnil 4to kogdta delal takoe :). Cogda mne nujno vzaimodeistvie mejdu prilojeniami ya ispol"zuiu com, posmotrel msdn destivitel"no WM_COPYDATA reshayet otsilku informatsii mejdu prilojeniami.

P.S. A nas4et "мастодонтами" ato kone4no cruto ;-)


Юрий Зотов   (2002-06-30 20:00:00) [2]

> jedi © (30.06.02 19:34)

Очень здорово объяснили азбучные истины, давно и хорошо известные. Но все равно спасибо (ведь повторение - мать учения).
:о)

Правда, переменная S в обоих процедурах - лишняя, да и передавать длину строки вовсе не требуется. Но беда не в этом.

Беда в том, что Ваш пример сработает ТОЛЬКО при передаче строки в пределах ОДНОЙ И ТОЙ ЖЕ программы (точнее, процесса). И не сработает при передаче строки из ОДНОЙ программы в ДРУГУЮ. Проверьте сами, если не верите. Вместо осмысленного текста Вы получите белиберду, мусор. Потому что адрес-то Вы передадите, это не проблема, вот только НА ЧТО ЭТОТ АДРЕС УКАЗЫВАТЬ БУДЕТ?

А ведь вопрос именно в этом и состоял.

Желание поспорить с "мастодонтами" - это, безусловно, хорошо. Но спорить-то надо после проверки своего кода, разве не так?


jedi   (2002-06-30 19:34:00) [3]

Zdes" primer SendMessage v toi je forme no esli ti obrobotcu zdelaeshi v liuboi drgoi formi(daje iz drugoi programi) iv SendMessage napisheshi pravil"noe zna4enie Handle ocna cotoroe doljno prinimat" sobshenie to vse budet rabotat".

Uspehov.

to Юрий Зотов ©, MBo ©, WM_IGOR © ... :
Tak kak WParam Lparam i Pointer imeiut odin i tot je razmer ravnii 32 bitam to mejdu nimi dopuscaetsea vzaimnoe preobrozovanie tipov. Na samom dele zdes" peredavastea adres peremenoi pri privedenii tipov polu4aetsea zna4enie. Naprimer esli vmesto SendMessage postavit" PostMessage rabotat" ne budet tak kak PostMessage ne jdiot otveta i vihodit iz subprogrami to est" peremenya uni4tojaetsea i kogda v obrobatuishei protsedure pitaeshea 4itat" zna4enie - ne polu4aetsea.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
WM_MYMESSAGE = WM_USER + 100;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure OnMyMessage(var Msg: TMessage); message WM_MYMESSAGE;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.OnMyMessage(var Msg: TMessage);
var
S: string;
begin
S := string(Msg.LParam);
MessageDlg(S, mtInformation, [mbOK], 0)
end;


procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
begin
S := "Hello from my program !!!";
SendMessage(Handle, WM_MYMESSAGE, Length(S), LongInt(S));
end;

end.


Юрий Зотов   (2002-06-30 09:19:00) [4]

Причем надо полагать, что и WM_COPYDATA работает по той же схеме.


MBo   (2002-06-30 08:57:00) [5]

Цитата из Рихтера

А дело в том, что система отслеживает сообщения WM_SETTEXT и обрабатывает их не так, как большинство других сообщений. При вызове SendMessage внутренний код функции проверяет, не пытаетесь ли Вы послать сообщение WM_SETTEXT. Если это так, функция копирует строку из Вашего адресного пространства в проекцию файла и делает его доступным другому процессу. Затем сообщение посылается пото ку другого процесса. Когда поток-приемник готов к обработке WM_SETTEXT, он оп ределяет адрес общей проекции файла (содержащей копию строки) в адресном про странстве своего процесса Параметру lParam присваивается значение именно этого адреса, и WM_SETTEXT направляется нужной оконной процедуре. После обработки этого сообщения, проекция файла уничтожается


Юрий Зотов   (2002-06-30 07:28:00) [6]

Дык... ясно, чем. Как раз этим и отличаются. И еще назначением. WM_SETTEXT - это не передача данных, а именно установка текста. Это может быть текст в окне, а может быть и Caption. А может и вообще ничего не быть.

Зато WM_COPYDATA - это именно передача данных. Притом ЛЮБЫХ данных, а не только строк.


WM_IGOR   (2002-06-30 04:45:00) [7]

->Юрию
Да, действительно прикольно... сообщение то WM_SETTEXT, а не WM_USER+N. Чем они отличаются в реализации Вам наверное виднее:)


Юрий Зотов   (2002-06-29 16:48:00) [8]

> WM_IGOR

Интересно, как же Вам это удается передавать "из одной проги в другую огромные куски текста" обычным WM_USER+N? Мзвините, не верю.

Нельзя ли маленький, но работающийпримерчик передачи строки длиной более восьми байт из одной программы в другую путем посылки сообщения и без использования WM_COPYDATA?


WM_IGOR   (2002-06-29 13:16:00) [9]

а строки тем не менее можно передавать


SPeller   (2002-06-29 09:22:00) [10]

2 [NIKEL] © (29.06.02 04:03)

Указатель этот будет на область памяти твоего процесса, откуда другой процесс прочитать уже не сможет. Я тоже думал что всё так просто, а оказалось нет.


[NIKEL]   (2002-06-29 04:03:00) [11]

а если передавать указатель в LPARAM ? на какуюнить структуру в памяти куда все строки и заносить?


WM_IGOR   (2002-06-28 15:57:00) [12]

а в чем проблема? таким способом я передаю из одной проги в другую огромные куски текста и прекрасно читается... правда я не использую паскалевские типы, но это как я понял без разницы...


WM_IGOR   (2002-06-28 15:52:00) [13]

to rhf
Мне интересно почему не получается. Я из одной проги в другую передаю именно таким образом огромные куски текста и все прекрасно читается. Хотя типы действительно идентичны.


rhf   (2002-06-27 05:05:00) [14]

2 WM_IGOR смотри самое начало........там твой способ

у каждого из процессов свое адресное пространство, а передаеться просто ссылка ...

решение, как сказал MBo - WM_COPYDATA


WM_IGOR   (2002-06-27 04:48:00) [15]

можно так попробовать
SendMessage("Program2".Handle, WM_USER+N, LPARAM(LPSTR("Some string")), 0)


Skyle   (2002-06-18 13:49:00) [16]

А ещё можно не особо напрягаться и использовать DDE %)


MBo   (2002-06-18 06:40:00) [17]

WM_COPYDATA


Alexsandr   (2002-06-18 06:22:00) [18]

ещё ты можешь использовать буфер обмена "TClipboard"


rhf   (2002-06-18 01:43:00) [19]

ну тебе нужны файлы отображенные в память....Memoey Mapped Files

подробнее смотри в SDK или MSDN, да и в FAQ наверняка есть что-то


ricks   (2002-06-18 01:06:00) [20]

>> rhf
А есть ли более человечный способ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо