Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 516

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Из одного приложения в другое требуется передать данные, в частности запись (record). Выделяю (AllocMem) кучу, копирую в неё запись и пересылаю указатель в сообщении другому приложению. Второе приложение принимает сообщение, забирает указатель, но при попытке "прочитать" структуру выдаёт "Ошибка доступа". Как я понял, нарвался на защиту ОСи приложений от взаимного влияния. А как всё-таки обмениваться данными?

Knjazev Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Knjazev (статус: 3-ий класс)
Вопрос отправлен: 23 апреля 2007, 20:26
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, Ласковый 3лоумышленник!
Конечно, обмен в памяти - самый быстрый способ. Но раз уж возникают проблемы, можно сделать по-другому. Где мы ещё можем хранить данные, кроме как в памяти? Правильно, в файле! Создаём типизированный файл:
var f: file of record_name;
И дальше работаем с файлом как обычно. Write и Read соответственно будут оперировать записями.
Работать, конечно, будет подольше, чем в памяти, но зато никаких препятствий не возникнет.
Удачи!

Ответ отправил: Dron (статус: Студент)
Время отправки: 23 апреля 2007, 20:42

Ответ #2. Отвечает эксперт: Вадим К

Обмениваться данными так как вы хотите - противоречит идее операционной системы вообще. Дело в том, что каждое приложение имеет свои 4 гигабайта памяти(ну не совсем, но для понимания хватит). И приложение не может так просто читать/писать в память другого приложения. А вы это хотите сделать. Запомните, указатель в одном приложении НЕДЕЙСТВИТЕЛЕН в другом. Что же делать?
Специально для таких случаем МС создала одно сообщение, которое нарушает это правило. Точнее не нарушает, а имитирует нарушение. Называется оно WM_COPYDATA Через это сообщение можно передать указатель. Только одно но - данные надо побыстрому скопировать и не надеяться, что имея указатель в другом приложении вы сможете передавать данные. (хотя в Win3.11 такое бы прошло). Вариант два (я так когда то делал) открывает приложение, с которого нам надо прочитать данные с помощью функций отладки. Дальше нам вся память будет доступна на чтение/запись. Но приложение будет остановлено. Жестокий, но в некоторых случаях единственный способ (особенно, когда нужно с чужого ListView данные стянуть).
Есть ещё один чудный способ - расшаренные файлы в памяти. Теперь только используем сообщения для уведомления.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 23 апреля 2007, 22:37
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 25 апреля 2007, 01:02; участников в обсуждении: 2.
Knjazev

Knjazev (статус: 3-ий класс), 23 апреля 2007, 21:51 [#1]:

Эх, Дрон, Дрон... А ещё можно через реестр и буфер обмена. Это называется плохой стиль программирования.
В моей задаче особенность: интенсивный многопоточный обмен данными между двумя приложениями. Настолько интенсивный, что при недостаточной оптимизации возникает проблема потери данных.
Knjazev

Knjazev (статус: 3-ий класс), 23 апреля 2007, 21:53 [#2]:

В принципе, можно, наверное, использовать отображение файлов в память, в данном контексте этим никогда не занимался. Хотелось бы увидеть какой-нить скелет-исходник, неохота бездарно тратить время на грабли
Dron

Dron (статус: Студент), 23 апреля 2007, 22:03 [#3]:

Система в любом случае не позволит обращаться к памяти другого приложения. Как ни крути. А что за данные в записи? Насколько она сложна?
С уважением.
Knjazev

Knjazev (статус: 3-ий класс), 25 апреля 2007, 01:02 [#4]:

Я решил не испытывать судьбу и переписать заново 2 в одном, сейчас "закладка фундамента" праекта. Чем проще, тем меньше ошибок.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:38
Выполнено за 0.03 сек.