![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
nmn |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
здравствуйте
пытаюсь создать разделяемую секцию у dll dll.cpp
dll.h
process1.cpp
process2.cpp
и вывод:
почему не работает? |
||||||||||
|
|||||||||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
проверьте длл, действительно ли там есть секция .mydata с флагом shared
Добавлено через 1 минуту и 12 секунд алсо если после WinExec("process2.exe",0); ничего нет, то длл благополучно выгрузится а потом загрузится. |
|||
|
||||
nmn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
о, сделал int SharedArray[100]={0}; и после этого и секция создалась и начала разделяться между процессами
|
|||
|
||||
TGrey |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Ну так во всех источник и так написано, что для того, что переменные были доступны, то они должны быть хоть как-то инициализированы.
|
|||
|
||||
nmn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
тут эти данные должны быть включены в сам файл, это увеличивает его размер, а можно как то сделать чтобы и память можно быть расшарить и размер файла не увеличивать?
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Memory Mapping Files . Например http://forum.vingrad.ru/forum/topic-254315...file/index.html -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
nmn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
ну с MemoryMapped, понятно
а вот еще такой вопрос, что если библиотека не сможет загрузиться по своему базовому адресу, что тогда будет с разделяемой секцией? |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Не должно быть проблем. Я так понимаю, что каждый образ exe хранит свое отображение виртуальных страниц на физические. Просто не нужно рассчитывать, что адреса переменных в 2х экзешниках совпадут. Физические совпадут, а то что должны совпасть виртуальные ни откуда не следует. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
||||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
nmn, в твоем примере секция mydata - это и есть та память, которая не меняет исходный размер образа, т.к. она выделяется загрузчиком, при формировании виртуального образа в памяти если проще, то такого рода секция должна иметь все данные, помеченные как uninitialized, которые при загрузке заполняются нулями, поэтому-то и требуется от переменных в такой секции не просто инициализироваться, а инициализироваться именно нулями, т.е. все данные в ней не должны иметь значений отличных от нуля, только в этом случае оптимизатор при линковке пометит всю секцию как uninitialized -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
GoldFinch |
|
||||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
вы использовали секцию инициализированных данных (.data) - по этому данные должны быть инициализированы. хотя она забита нулями, она все равно занимает место на диске, это недоработка линкера
используйте секцию неинициализированных данных (.bss)
такая секция не будет занимать место на диске, и данные не надо инициализировать в исходнике (они будут инициализированы нулями) свойства этой секции будут следующие: 02 .shdata VirtSize: 00000004h VirtAddr: 00002000h raw data offs: 00000000h raw data size: 00000000h relocation offs: 00000000h relocations: 00000000h line # offs: 00000000h line #'s: 00000000h characteristics: D0000080h UNINITIALIZED_DATA SHARED READ WRITE ALIGN_DEFAULT(16) |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |