FAQ:WinAPI VCPP:разделяемые переменные в dll — различия между версиями
Материал из Весельчак У
RXL (обсуждение | вклад) м (/* Имеется DLL. В ней есть некоторые данные (скажем, массив int). Как сделать, чтобы переменные в DLL были одними и теми же для всех программ, исп) |
Mczim (обсуждение | вклад) (/* Имеется DLL. В ней есть некоторые данные (скажем, массив int). Как сделать, чтобы переменные в DLL были одними и теми же для всех программ, исп) |
||
Строка 2: | Строка 2: | ||
Есть два пути решения: | Есть два пути решения: | ||
− | # Проецируемые в память файлы (с доступом чтение/запись). Книга: Д. Рихтер " | + | # Проецируемые в память файлы (с доступом чтение/запись). Книга: Д. Рихтер "Windows для проффесионалов", Глава 17. |
# Разделяемые переменные. Та же глава. | # Разделяемые переменные. Та же глава. | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
// Здесь создаём свой сегмент данных. Переменные должны | // Здесь создаём свой сегмент данных. Переменные должны | ||
− | // быть обязательно иницилизированы и | + | // быть обязательно иницилизированы и помещены между |
// двумя pragma data_seg. Иначе они не войдут в данный | // двумя pragma data_seg. Иначе они не войдут в данный | ||
// сегмент. | // сегмент. |
Текущая версия на 22:00, 6 августа 2008
Имеется DLL. В ней есть некоторые данные (скажем, массив int). Как сделать, чтобы переменные в DLL были одними и теми же для всех программ, использующих эту DLL? (Например, при загрузке DLL, в массиве нет данных. Каждая программа добавит в массив новые данные.)
Есть два пути решения:
- Проецируемые в память файлы (с доступом чтение/запись). Книга: Д. Рихтер "Windows для проффесионалов", Глава 17.
- Разделяемые переменные. Та же глава.
// Здесь создаём свой сегмент данных. Переменные должны // быть обязательно иницилизированы и помещены между // двумя pragma data_seg. Иначе они не войдут в данный // сегмент. #pragma data_seg("Shared") LONG g_lInstanceCount = 0; #pragma data_seg() // Теперь только осталось указать компилятору свойства этого сегмента #pragma comment(linker, /SECTION Shared,RWS );
Есть другой путь принудительного включения в сегмент, но сегмент уже должен быть упомянут ранее.
__declspec(allocate("Shared")) int с = 0;