|
Вопрос # 516/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Из одного приложения в другое требуется передать данные, в частности запись (record). Выделяю (AllocMem) кучу, копирую в неё запись и пересылаю указатель в сообщении другому приложению. Второе приложение принимает сообщение, забирает указатель, но при попытке "прочитать" структуру выдаёт "Ошибка доступа". Как я понял, нарвался на защиту ОСи приложений от взаимного влияния. А как всё-таки обмениваться данными?
 |
Вопрос задал: 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 (статус: 3-ий класс), 23 апреля 2007, 21:51 [#1]:
Эх, Дрон, Дрон... А ещё можно через реестр и буфер обмена. Это называется плохой стиль программирования.
В моей задаче особенность: интенсивный многопоточный обмен данными между двумя приложениями. Настолько интенсивный, что при недостаточной оптимизации возникает проблема потери данных.
|
|
Knjazev (статус: 3-ий класс), 23 апреля 2007, 21:53 [#2]:
В принципе, можно, наверное, использовать отображение файлов в память, в данном контексте этим никогда не занимался. Хотелось бы увидеть какой-нить скелет-исходник, неохота бездарно тратить время на грабли
|
|
Dron (статус: Студент), 23 апреля 2007, 22:03 [#3]:
Система в любом случае не позволит обращаться к памяти другого приложения. Как ни крути. А что за данные в записи? Насколько она сложна?
С уважением.
|
|
Knjazev (статус: 3-ий класс), 25 апреля 2007, 01:02 [#4]:
Я решил не испытывать судьбу и переписать заново 2 в одном, сейчас "закладка фундамента" праекта. Чем проще, тем меньше ошибок.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|