Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > создание раздляемой области памяти dll |
Автор: nmn 24.4.2010, 01:04 | ||||||||||
здравствуйте пытаюсь создать разделяемую секцию у dll dll.cpp
dll.h
process1.cpp
process2.cpp
и вывод:
почему не работает? |
Автор: GoldFinch 24.4.2010, 01:13 |
проверьте длл, действительно ли там есть секция .mydata с флагом shared Добавлено через 1 минуту и 12 секунд алсо если после WinExec("process2.exe",0); ничего нет, то длл благополучно выгрузится а потом загрузится. |
Автор: nmn 24.4.2010, 03:55 |
о, сделал int SharedArray[100]={0}; и после этого и секция создалась и начала разделяться между процессами |
Автор: TGrey 24.4.2010, 22:40 |
Ну так во всех источник и так написано, что для того, что переменные были доступны, то они должны быть хоть как-то инициализированы. |
Автор: nmn 25.4.2010, 08:31 |
тут эти данные должны быть включены в сам файл, это увеличивает его размер, а можно как то сделать чтобы и память можно быть расшарить и размер файла не увеличивать? |
Автор: nmn 25.4.2010, 17:30 |
ну с MemoryMapped, понятно а вот еще такой вопрос, что если библиотека не сможет загрузиться по своему базовому адресу, что тогда будет с разделяемой секцией? |
Автор: Alexeis 25.4.2010, 18:59 | ||
Не должно быть проблем. Я так понимаю, что каждый образ exe хранит свое отображение виртуальных страниц на физические. Просто не нужно рассчитывать, что адреса переменных в 2х экзешниках совпадут. Физические совпадут, а то что должны совпасть виртуальные ни откуда не следует. |
Автор: GoldFinch 25.4.2010, 19:23 | ||
можно попробовать делать .obj с этой секцией компилятором который позволит сделать ее пустой (например fasm'ом) |
Автор: GremlinProg 26.4.2010, 09:30 | ||
nmn, в твоем примере секция mydata - это и есть та память, которая не меняет исходный размер образа, т.к. она выделяется загрузчиком, при формировании виртуального образа в памяти если проще, то такого рода секция должна иметь все данные, помеченные как uninitialized, которые при загрузке заполняются нулями, поэтому-то и требуется от переменных в такой секции не просто инициализироваться, а инициализироваться именно нулями, т.е. все данные в ней не должны иметь значений отличных от нуля, только в этом случае оптимизатор при линковке пометит всю секцию как uninitialized |
Автор: GoldFinch 26.4.2010, 15:47 | ||||||
вы использовали секцию инициализированных данных (.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) |