Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Переменные, доступные везде


Автор: petlyura 15.8.2008, 09:02
Есть два exe-файла и статическая библиотека. Как сделать так, чтобы переменные (строковые, целые) были доступны везде (в этих 2 исполн. файлах и библиотеке)?
Например, меняю значение переменной Path = "C://"; в 1.exe, после этого читаю в 2.exe значение Dir = Path; или в библиотеке Dir = Path; и Dir получается,равным Path.

Объявлял эти переменные в статич.библ. как

Код

#if defined(SUBD_DLL)
# define SUBD_CLASS __declspec(dllexport)
#else
# if defined(SUBD_APP)
# define SUBD_CLASS __declspec(dllimport)
# else
# define SUBD_CLASS
# endif
#endif

SUBD_CLASS int GraphTimesInterval;  // interval for update graphics chart
SUBD_CLASS AnsiString Path;


В файлах стат.библ., использующих эти переменные, указанно 
#define SUBD_DLL
в ехе: 
#define SUBD_APP

и подключен файл, где определены, Path и GraphTimesInterval.

Работает! А потом пишу новые классы, функциональность и т.п. и перестает работать.
Где-то получается 3 варианта:
Dir = Path; 
Отладчик показывает значения переменных
1) Dir = NULL; Path = NULL, хотя до этого Path = "C:\\"
2) Dir = NULL; Path = "C:\\";
3) Dir = "C:\\"; Path = NULL;   это вообще самое удивительное.

Подозреваю, что может это как-то зависит от подключения файлов, а то у меня как-то лихо накручено, 
например, есть client.h, kadr.h, dbd.h
В client'e 
#include "kadr.h"
#include "dbd.h"

В kadr'e
#include "dbd.h"

Только все в больших масштабах.

Подскажите, пожалуйста, решение


Автор: petlyura 15.8.2008, 11:48
Млин, нестабильно все это!

Может в реестр писать и читать оттуда, чтоб наверняка?

Писать в файл не надежно, т.к. GetCurrentDir() в зависимости от того, где прога гуляет (у меня кучу директорий вокруг, откуда берутся рисунки, файлы описания и все такое), может выдавать разные значения. И я могу файл не найти или его удалят.

Автор: Lazin 15.8.2008, 11:57
в статической библиотеке не нужно использовать
Цитата(petlyura @  15.8.2008,  09:02 Найти цитируемый пост)
__declspec(dllexport)

можно просто считать что вместо статической библ. у тебя в проекте соответствующий срр файл

Автор: xvr 15.8.2008, 14:48
Цитата(petlyura @ 15.8.2008,  09:02)
Есть два exe-файла и статическая библиотека. Как сделать так, чтобы переменные (строковые, целые) были доступны везде (в этих 2 исполн. файлах и библиотеке)?

Никак  smile Статическая библиотека прилинковавается к всему остальному, образуя исполняемый файл. В каждом исполняемом файле будет СВОЯ копия твоей статической библиотеки, и соотвественно свои переменные.
Если у тебя библиотека динамическая, то она будет загруженна в одном экземпляре в каждое приложение, где используется. Но адремные пространства самих приложений друг с другом не пересекаются, т.е. переменные опять же свои собственные у каждого приложения.
Однако, в динамической библиотеке можно сделать shared сегмент, все данные в нем будут общими для всех экземпляров данной библиотеке во всех программах, где она используется. Однако это сложно использовать по 3м причинам:
  •  Приложения должны работать ОДНОВРЕМЕННО, т.к. если сначала закончится одно а потом стартует другое, то в промежутке dll будет выгруженна и содержимое общих переменных будет потеряно
  •  Так можно передавать только POD типы. Попытка передать например AnsiString успехом не увенчается - она сама бкдет расделаться, а вот память с непосредственно строкой - нет, т.к. она выделяется на куче, а ее разделять никто не будет  smile 
  •  Появится масса проблем с одновременным доступом к переменным из нескольких процессов - нужно вводить синхронизацию
Резюме - храни данные снаружи (реестр вполне подойдет)

Автор: petlyura 18.8.2008, 08:14
Цитата(xvr @  15.8.2008,  14:48 Найти цитируемый пост)
Если у тебя библиотека динамическая, то она будет загруженна в одном экземпляре в каждое приложение, где используется. Но адремные пространства самих приложений друг с другом не пересекаются, т.е. переменные опять же свои собственные у каждого приложения.

Я неверно объяснил проблему. Exe-файлы запускаются независимо друг от друга, при этом обычно запущена лишь одна exe. Мне не надо, чтобы данные из одной exe были видны в другой, они независимы. Надо только, чтобы были видны в одной из exe и библиотеке. 
Я пока решил эту проблему, но окольными путями. Если что буду делать через реестр

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)