Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Переменные :(


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

static BOOL bNorm = FALSE;

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

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

Автор: Baa 14.7.2002, 21:04
Пробуй менять через указатель ;-)

Автор: Sheff 14.7.2002, 21:15
Пробовал, не получается

Автор: podval 15.7.2002, 09:53
сможешь изменить, если уберешь 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.

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

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

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

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

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

static BOOL bNorm = FALSE;

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

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

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

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

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

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