| 
| 
 | Вопрос # 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 в одном, сейчас "закладка фундамента" праекта. Чем проще, тем меньше ошибок. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |