Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переменные, доступные везде, Как сделать? 
:(
    Опции темы
petlyura
Дата 15.8.2008, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: 2
Всего: 2



Есть два 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"

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

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


PM MAIL   Вверх
petlyura
Дата 15.8.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: 2
Всего: 2



Млин, нестабильно все это!

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

Писать в файл не надежно, т.к. GetCurrentDir() в зависимости от того, где прога гуляет (у меня кучу директорий вокруг, откуда берутся рисунки, файлы описания и все такое), может выдавать разные значения. И я могу файл не найти или его удалят.
PM MAIL   Вверх
Lazin
Дата 15.8.2008, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



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

можно просто считать что вместо статической библ. у тебя в проекте соответствующий срр файл
PM MAIL Skype GTalk   Вверх
xvr
Дата 15.8.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

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

PM MAIL   Вверх
petlyura
Дата 18.8.2008, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: 2
Всего: 2



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

Я неверно объяснил проблему. Exe-файлы запускаются независимо друг от друга, при этом обычно запущена лишь одна exe. Мне не надо, чтобы данные из одной exe были видны в другой, они независимы. Надо только, чтобы были видны в одной из exe и библиотеке. 
Я пока решил эту проблему, но окольными путями. Если что буду делать через реестр
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0448 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.