Одесса: 8°С (вода 9°С)
Киев: 3°С
Львов: 4°С

Тема: Помогите передать данные из одной функции в другую.

Ответить в теме
Показано с 1 по 12 из 12
  1. Вверх #1
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1

    Post Помогите передать данные из одной функции в другую.

    Задачка под MsWindows.

    bool bSomeBool = false;

    void a()
    {
    bSomeBool = true;
    }

    void CALLBACK b()
    {
    if(bSomeBool)
    {
    // что-то там
    }
    }

    Функция b - хук окна, которая выполняется в контексте окна,
    и, естественно, if(bSomeBool) нихрена не работает,
    потому как совсем другое распределение памяти.

    Вопрос:
    как красиво передать это самое значение bSomeBool из a() в b()?


  2. Вверх #2
    Частый гость Аватар для THRESHE
    Пол
    Мужской
    Адрес
    Одесса
    Сообщений
    985
    Репутация
    39
    Если для MFC то можно поместить эту переменную в глобальный объект производный от CWinApp. Ну, а дальше с помощью AfxGetApp() получаешь указатель на объект

  3. Вверх #3
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1
    Цитата Сообщение от THRESHE Посмотреть сообщение
    Если для MFC то можно поместить эту переменную в глобальный объект производный от CWinApp. Ну, а дальше с помощью AfxGetApp() получаешь указатель на объект
    Нет, голый SDK.

    Кстати, на счет глобального объекта от CWinApp сильно сомневаюсь.
    Потому как разницы при размещении глобальной переменной bool,
    и любого навороченного глобального объекта - никакой.

    В принципе, я могу достать из системы хэндл окна и кинуть
    эту переменную юзеровским сообщением из функции a(),
    естественно это докатится до хука b(), в котором я могу это вытащить.

    Нет проблем также записать данные в файл с известным именем в a()
    и прочитать из файла в b(),
    но использование дисковых операций кажется бредом.

    Можно также воспользоваться сокетами ,
    но и это решение не кажется элегантным для передачи одного значения.

    Другие идеи есть?

  4. Вверх #4
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    30
    Сообщений
    2,952
    Репутация
    148
    А почему не работает?
    Если хук локальный для текущего потока, и распологается не в dll,
    фокус с глобальной переменной работает..

    Код:
    bool bSomeBool = true;
    
    .....
    .....
    
     LRESULT CALLBACK FilterFunc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if (bSomeBool )
    	{
    		MessageBox(0,"Yohoo!!","Yohoo!",0);
    		
    	}
    
    	return 0;
    
    }
    
    ....
    ....
    
    SetWindowsHookEx(WH_KEYBOARD,FilterFunc,hInstance, GetCurrentThreadId());
    ~ Motivation is what gets you started. Habit is what keeps you going.

  5. Вверх #5
    Посетитель Аватар для traveller
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    34
    Сообщений
    171
    Репутация
    25
    Цитата Сообщение от lexar Посмотреть сообщение
    В принципе, я могу достать из системы хэндл окна и кинуть
    эту переменную юзеровским сообщением из функции a(),
    естественно это докатится до хука b(), в котором я могу это вытащить.
    вот эта идея с сообщением ИМХО самая неплохая
    Цитата Сообщение от lexar Посмотреть сообщение
    Другие идеи есть?
    с помощью NamedPipe

  6. Вверх #6
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1
    Цитата Сообщение от Яр Посмотреть сообщение
    А почему не работает?
    Если хук локальный для текущего потока, и распологается не в dll,
    фокус с глобальной переменной работает..
    Хук совсем не для текущего потока.

    ghCallWndHook = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, ghInst, 0);

    В доке честно сказано,
    вызывается в контексте перехваченного окна.
    Да и проверил я.

  7. Вверх #7
    Посетитель
    Пол
    Мужской
    Возраст
    39
    Сообщений
    239
    Репутация
    18
    тяжело с виндовсом...
    врядли это поможет в решении вашей проблемы, но давать подобные имена переменным начали по глупости, и незачем это повторять

  8. Вверх #8
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1
    Цитата Сообщение от pal Посмотреть сообщение
    тяжело с виндовсом...
    врядли это поможет в решении вашей проблемы, но давать подобные имена переменным начали по глупости, и незачем это повторять
    С волками жить по волчьи выть.
    Кому не нравится венгерская нотация - его проблемы.

    По теме:
    если кому интересно, я нашел приличное решение:
    Функции SetProp / GetProp позволяют привязать к окну любые
    данные используя текстовый идентификатор.
    Так как окна глобальны, эти данные можно извлечь/установить где угодно.

    Еще идеи?

  9. Вверх #9
    Посетитель
    Пол
    Мужской
    Возраст
    39
    Сообщений
    239
    Репутация
    18
    оригинальная венгерская нотация использовала осмысленные префиксы, а популяризованные мелкомягкими не несущие смысловой нагрузки префиксы называют венгерской нотацией по ошибке
    врядли кто-то испытывает проблемы от того, что ему не нравятся глупости

  10. Вверх #10
    Ловец Снов Аватар для lexar
    Пол
    Мужской
    Сообщений
    11,535
    Репутация
    7269
    Записей в дневнике
    1
    Цитата Сообщение от pal Посмотреть сообщение
    оригинальная венгерская нотация использовала осмысленные префиксы, а популяризованные мелкомягкими не несущие смысловой нагрузки префиксы называют венгерской нотацией по ошибке
    врядли кто-то испытывает проблемы от того, что ему не нравятся глупости
    На вкус и цвет.
    Кроме венгерской нотации с разумным префиксом lpszName
    (типа длинный указатель на строку, завершающуюся нулем)
    Может быть нормальная нотация
    sName , потому как в Win32 все указатели по умолчанию длинные,
    а строка в языках C, C++ обычно завершается нулем.
    Зачем кричать, что масло масленое?

    Я работал в разных фирмах,
    сталкивался еще и с внутренними стандартами именования переменных.

    Не думаю, что есть "более правильная" и "менее правильная" нотация.
    Просто если работаешь в команде,
    стоит придерживаться какой-то единой нотации.

  11. Вверх #11
    Посетитель
    Пол
    Мужской
    Возраст
    39
    Сообщений
    239
    Репутация
    18
    Цитата Сообщение от lexar Посмотреть сообщение
    На вкус и цвет.
    Кроме венгерской нотации с разумным префиксом lpszName
    я уже вроде говорил, что использование имен типов в качестве префикса не имеет ничего общего с венгерской нотацией. это могло бы быть осмысленным в языке с динамической типизацией, но в с++ типы проверяет компилятор.

  12. Вверх #12
    Посетитель
    Пол
    Мужской
    Возраст
    39
    Сообщений
    239
    Репутация
    18
    lol
    ---
    A particularly well known example is the standard WPARAM type, and the accompanying wParam formal parameter in many Windows system function declarations. It was originally a 16 bit type, but was changed to a 32 bit or 64 bit type in later versions of the operating system while retaining its original name (its true underlying type is UINT_PTR, that is, an unsigned integer large enough to hold a pointer)
    ---
    The .NET Framework, Microsoft's new software development platform, lacks Hungarian notation completely; the .NET Framework Guidelines advise programmers that it should not be used
    ---
    даже мелкомягкие со временем одумываются


Ответить в теме

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения