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