Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2008, 19:51   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Общение между програмамми...

Привет всем!
Есть такая задача. Хочу сразу сказать, что-бы не предлогали решения, не имеющих даже косвенной связи с настоящим вопросом. Мне просто стало интересно.
Короче, есть 2 проги. I посылает сообщение II. Условие, хендл известен!
Код:
// Отправка мессяга и получение указателя на переменную str: string (I прога);
procedure getValue;
var
retValue: integer;
begin
   retValue := sendMessage(h: HWND, wm_user+1, 0, 0);
   form1.caption := string(pointer(retValue)^);
end;

// Обработка месяга (II прога);
procedure wmUserMessage(var message: tMessage);
begin
   str := inputBox('Ввод значения', Введите значение, которое будит вернуто а резалте', '(нифигаськи не введено)');
   {str: string - глобальная переменная form1: tForm  (II прога)}
   message.result := integer(@str);
Просто числовые значения передаются нормально, т.е.
Код:
...
form1.caption := intToStr(retValue);
...
message.result := length(str);
...
А так пустая строка возвращается. С pChar то-жа самое Как быть?
Altera вне форума Ответить с цитированием
Старый 07.12.2008, 20:28   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

У вас нет понятия что такое процесс... данных находятся в разных сегментах в разных адрессах памяти. Почему бы вам просто не юзать File Mapping ? там по имени спокойно обращаться можно к общей кучи для двух приложений.
BOBAH13 вне форума Ответить с цитированием
Старый 07.12.2008, 21:45   #3
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Ясно, а если напишу:
p := @s;
sendMessage(h: HWND, wm_user+1, integer(p: pinter), 0);
то нормально примет?
Altera вне форума Ответить с цитированием
Старый 07.12.2008, 22:05   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

http://pblog.ru/?p=8
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 08.12.2008, 19:25   #5
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Значит общаться между приложениями модно только по средствам tWMCopyData? Если нужно это делать только при помощи сообщений?
А всётке интересно, почему? Ведь integer-ы передаёт нормально. Пачему он так hendle не может передать, или поинтер?

Вот так, например, нормально работает:
Код:
...
procedure Tforma.Button1Click(Sender: TObject);
begin
   sendMessage(h, wm_user+1, handle, 0);
end;
...
procedure TEXE_FORM2.Getmessage(var msg: tMessage);
begin
   sendMessage(msg.WParam, wm_close, 0, 0);
end;
...
почему таким макаром нельзя указатель на переменную передать?

Последний раз редактировалось rpy3uH; 09.12.2008 в 12:42.
Altera вне форума Ответить с цитированием
Старый 08.12.2008, 20:32   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от Altera Посмотреть сообщение
Значит общаться между приложениями модно только по средствам tWMCopyData? Если нужно это делать только при помощи сообщений?
А всётке интересно, почему? Ведь integer-ы передаёт нормально. Пачему он так hendle не может передать, или поинтер?
Я понимаю вы очень занятой человек и прочитать мой пост вообще не судьба ?
BOBAH13 вне форума Ответить с цитированием
Старый 09.12.2008, 04:22   #7
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Я читал ваш пост...
Значит, если я правильно понял, адресс одной переменной одного процесса, может совпадать и адресом переменной другого процесса? А что с File Mapping-ом?

Последний раз редактировалось Altera; 09.12.2008 в 04:49.
Altera вне форума Ответить с цитированием
Старый 09.12.2008, 11:00   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Адреса не могут совпадать. Как я понимаю... в нашем случае имеется Виндовс.. поэтому адресс это [адрес сегмента]:[смешение] так вот это смещение может совпадать, а вот адреса никак. адрес сегмента слово - регистр cs... но даже если так просто взять и поменять то вам не даст виндовс так просто обращаться к адресному простарнству другого процеса. Для этого имеются функции Read(Write)ProcessMemory. В теории можно в сообщение передать адресс переменной просто DWord(@Variable) а потом через ReadProcessMemory попробывать произвести чтение из этого адреса нужного кол-ва байт. Но серьезно... проверять эту теорию не проверял, но поидеи должно проканать.

File Mapping - в сети уйма материала который все описывает. Сдесь опять рассказывать не буду.

Заинтерисовался своей теорией все вышло...смотрим пример
Вложения
Тип файла: zip memory.zip (2.5 Кб, 19 просмотров)

Последний раз редактировалось rpy3uH; 09.12.2008 в 12:43.
BOBAH13 вне форума Ответить с цитированием
Старый 09.12.2008, 12:50   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Как я понимаю... в нашем случае имеется Виндовс.. поэтому адресс это [адрес сегмента]:[смешение] так вот это смещение может совпадать, а вот адреса никак. адрес сегмента слово - регистр cs... но даже если так просто взять и поменять то вам не даст виндовс так просто обращаться к адресному простарнству другого процеса.
во всех процессах в Windows в CS, DS, SS находятся одни и теже значения. адреса могут совпадать, но по этим адресам могут находится другие данные. У каждого процесса 2 Гигабайта памяти - это число никак не зависит от физической памяти! пусть даже на машине стоит 32 МБ памяти, процессу всё равно доступно 2 ГБ. процесс с ними что хочет, то и делает. Т.е. один процесс про адресу может загрузить по адресу 0х100000 какой нибудь файл на 1 гигабайт. Второй процесс даже если обратится по этому адресу, то он ничего не увидит. Все процессы изолированы друг от друга!
С помощью FileMapping можно разделять один кусок памяти между несколькими процессами. FileMapping является главным средством межпроцессорного взаимодействия, тем более когда надо обмениваться большими порциями данных.
rpy3uH вне форума Ответить с цитированием
Старый 09.12.2008, 15:36   #10
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
во всех процессах в Windows в CS, DS, SS находятся одни и теже значения. адреса могут совпадать, но по этим адресам могут находится другие данные. У каждого процесса 2 Гигабайта памяти - это число никак не зависит от физической памяти! пусть даже на машине стоит 32 МБ памяти, процессу всё равно доступно 2 ГБ. процесс с ними что хочет, то и делает. Т.е. один процесс про адресу может загрузить по адресу 0х100000 какой нибудь файл на 1 гигабайт. Второй процесс даже если обратится по этому адресу, то он ничего не увидит. Все процессы изолированы друг от друга!
С помощью FileMapping можно разделять один кусок памяти между несколькими процессами. FileMapping является главным средством межпроцессорного взаимодействия, тем более когда надо обмениваться большими порциями данных.
А это только с page file-ом можно делать?
Altera вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Общение между формами kate4ka Общие вопросы Delphi 2 10.03.2008 22:49
Общение форм Rapid Общие вопросы Delphi 9 17.11.2007 17:56
Общение программ через TEvent UnD)eaD)Snake Win Api 6 11.09.2007 07:03
"Общение" между формой и вызываемой процедурой Квэнди Общие вопросы Delphi 6 11.01.2007 14:10