Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];

Вниз

Строка через Message   Найти похожие ветки 

 
ricks   (2002-06-18 00:34) [0]

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


 
rhf   (2002-06-18 00:44) [1]

твоим способом строку можно передать толлько по частям, в смысле по сиволу в каждом wparam или lparam... ну и так до конца строки


 
ricks   (2002-06-18 01:06) [2]

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


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

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

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


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

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


 
MBo   (2002-06-18 06:40) [5]

WM_COPYDATA


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

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


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

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


 
rhf   (2002-06-27 05:05) [8]

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

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

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


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

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


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

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


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

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


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

2 [NIKEL] © (29.06.02 04:03)

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


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

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


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

> WM_IGOR

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

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


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

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


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

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

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


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

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

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


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

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


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

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 20:00) [20]

> jedi © (30.06.02 19:34)

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

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

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

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

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


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

Юрий Зотов ©:
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 ;-)



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

Форум: "WinAPI";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
1-3513
maxim2
2002-08-20 12:34
2002.09.02
Как отловить нажатие правой кнопки мыши


1-3413
ev
2002-08-21 21:30
2002.09.02
разделители в ToolBar (как в ворде)


4-3676
МитяЙ2
2002-06-20 14:27
2002.09.02
Временная папка


14-3576
s-gorbachev
2002-08-05 16:55
2002.09.02
Помогите купить сервер(железку) для IB6 на 50 юзеров


8-3532
MagG0T
2002-04-13 18:27
2002.09.02
Столкновение спрайтов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский