FAQ:WinAPI VCPP:разделяемые переменные в dll — различия между версиями

Материал из Весельчак У
Перейти к: навигация, поиск
(Новая: ===Имеется DLL. В ней есть некоторые данные (скажем, массив int). Как сделать, чтобы переменные в DLL были одн...)
 
м (/* Имеется DLL. В ней есть некоторые данные (скажем, массив int). Как сделать, чтобы переменные в DLL были одними и теми же для всех программ, исп)
Строка 5: Строка 5:
 
# Разделяемые переменные. Та же глава.
 
# Разделяемые переменные. Та же глава.
  
<pre>
+
<syntaxhighlight lang="cpp">
 
// Здесь создаём свой сегмент данных. Переменные должны
 
// Здесь создаём свой сегмент данных. Переменные должны
 
// быть обязательно иницилизированы и помешены между
 
// быть обязательно иницилизированы и помешены между
Строка 17: Строка 17:
  
 
#pragma comment(linker, /SECTION Shared,RWS );
 
#pragma comment(linker, /SECTION Shared,RWS );
</pre>
+
</syntaxhighlight>
  
 
Есть другой путь принудительного включения в сегмент, но сегмент уже должен быть упомянут ранее.
 
Есть другой путь принудительного включения в сегмент, но сегмент уже должен быть упомянут ранее.
  
 +
<syntaxhighlight lang="cpp">
 
  __declspec(allocate("Shared")) int с = 0;
 
  __declspec(allocate("Shared")) int с = 0;
 +
</syntaxhighlight>
  
 
[[Category:FAQ:WinAPI VCPP]]
 
[[Category:FAQ:WinAPI VCPP]]

Версия 01:05, 30 июля 2008

Имеется DLL. В ней есть некоторые данные (скажем, массив int). Как сделать, чтобы переменные в DLL были одними и теми же для всех программ, использующих эту DLL? (Например, при загрузке DLL, в массиве нет данных. Каждая программа добавит в массив новые данные.)

Есть два пути решения:

  1. Проецируемые в память файлы (с доступом чтение/запись). Книга: Д. Рихтер "Виндовс для проффесионалов", Глава 17.
  2. Разделяемые переменные. Та же глава.
// Здесь создаём свой сегмент данных. Переменные должны
// быть обязательно иницилизированы и помешены между
// двумя 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;