Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переменные :( 
:(
    Опции темы
Sheff
Дата 14.7.2002, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

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



Я создал DLL в которой стоит системная ловушка, там объявлена переменная, вот так:
Код

static BOOL bNorm = FALSE;

Затем другая программа вызывает функцию из этой DLL, которая ставит Hook и изменяет переменную в TRUE:
Код
bNorm=TRUE;

Но потом оказвается, что bNorm так и осталась FALSE :((((
Что делать, как изменить значение переменной ???
P.S: Ради интереса я написал в DllMain bNorm=TRUE, получилось :) Почему же из других функций не получается изменять ?


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Baa
Дата 14.7.2002, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Пробуй менять через указатель ;-)


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Sheff
Дата 14.7.2002, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

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



Пробовал, не получается


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
podval
Дата 15.7.2002, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

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



сможешь изменить, если уберешь static.
Это очень грозное ключевое слово! :) см. help:
Цитата

Use the static storage class specifier with a local variable to preserve the last value between successive calls to that function. A static variable acts like a local variable but has the lifetime of an external variable.

In a class, data and member functions can be declared static. Only one copy of the static data exists for all objects of the class.

A static member function of a global class has external linkage. A member of a local class has no linkage. A static member function is associated only with the class in which it is declared. Therefore, such member functions cannot be virtual.

Static member functions can only call other static member functions and only have access to static data. Such member functions do not have a this pointer.

PM WWW ICQ   Вверх
Sheff
Дата 15.7.2002, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

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



Убирал, всё равно не получается, просто фигня какая-то, уже не знаю, что делать, а сделать это надо срочно :(


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
fox
Дата 15.7.2002, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.4.2002

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



Кажется я сталкивался с такой проблемой, и дело здесь во в чем:
DLL загружается в область того процесса, который с ней работает и глобальные переменные, определенные в DLL имеют свои значения в каждом процессе, в который подгружается DLL.
 Поэтому если одна программа (процесс) изменила переменную DLL, то другая программа (процесс) этого никогда не увидит
PM MAIL   Вверх
Sheff
Дата 15.7.2002, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

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



Цитата(fox @ 15.7.2002, 14:02)
Кажется я сталкивался с такой проблемой, и дело здесь во в чем:
DLL загружается в область того процесса, который с ней работает и глобальные переменные, определенные в DLL имеют свои значения в каждом процессе, в который подгружается DLL.
 Поэтому если одна программа (процесс) изменила переменную DLL, то другая программа (процесс) этого никогда не увидит

Дык как ж мне быть ?  :notify


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 16.7.2002, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

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



Fox прав, в принципе. Сегмент данных dll для каждого процесса который его подгружает свой (как и сегмент кода, в общем, но коду то все равно - выполняется и выполняется), однако есть и разделямый сегмент данных. Но это имеет смысл, тольлко если несколько процессов погружают эту dll и пытаются изменять глобальные переменные этой dll, которые свои, на самом деле, для каждого процесса. Есть вопрос как ты пытаешься изменить свою переменную, и как ты загружаешь свою dll. Короче, самый правильный способ был бы, если ты вызываешь функцию dll, которая и меняет это значение. Примерно так:

static BOOL bNorm = FALSE;

void SetbNorm(bool Value)
{
bNorm=Value;
}

А потом в своей программе:
SetbNorm(TRUE);

Если же тебя интересует разделение этой переменной между разными процессами, то вопрос отдельный.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Sheff
Дата 16.7.2002, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

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



DLL загружается неявно и привязана к 1 процессу, к моей exe'шке.
2 Fantasist:
Этот способ не подходит, т.к я так в принципе и делал, вызывал функцию из DLL, которая "меняла" значение переменной.


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 16.7.2002, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

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



Тогда что еще можно сказать? Трассируй. Посмотри как она себя ведет - наверное ошибка где-то в другом. Типа не заметил, как где-то ее еще кто-то поменял или воспользовался тем же именем, но для локальной переменной. Попробуй, в конце концов без инициализации.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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