Как получить HINSTANCE для функции CreateWindowEX при использовании ее вне WinMain?

Я пытаюсь создать всплывающее окно, когда я нажимаю кнопку в моем главном окне, и я использую функцию CreateWindowEX для этой цели. Однако функция CreateWindowEx получает переменную типа HINSTANCE в качестве своего второго последнего параметра. Учитывая, что я создаю это новое окно изнутри WndProcedure при нажатии кнопки, переменная HINSTANCE в функции WinMain не будет мне доступна, поскольку она не является глобальной переменной.

Следующий код был получен из функции обратного вызова WndProcedure:

            case IDC_BUTTON PRESSED:
            {

                const char g_szClassName2[] = "POPWIND";
                const char WndName2[] = "POPUP WINDOW";

                HWND invisWindowHandle = CreateWindowEx(0,
                      g_szClassName2,
                      WndName2,
                      WS_OVERLAPPEDWINDOW,
                      200,
                      200,
                      800,
                      500,
                      NULL,
                      NULL,
                      hInstance,//THIS IS THE VARIABLE I AM HAVING TROUBLE GETTING
                      NULL);

                ShowWindow(invisWindowHandle, 3);// SW_SHOWNORMAL);
                UpdateWindow(invisWindowHandle);
             }

Как мне получить нужную мне переменную hInstance, чтобы функция CreateWindowEx работала внутри функции обратного вызова WndProcedure?

Примечание. Я подумал о том, чтобы сделать переменную hInstance глобальной, но я не уверен, нужно ли использовать один и тот же hInstance для каждого окна, которое создает мое приложение.

1 ответ

Решение

Winapi несет некоторый багаж, который он унаследовал от версий Windows с 1 по 3. Они использовали совместную многозадачность, выполнение одной и той же "задачи" было реализовано с использованием одной и той же программы и передачей ей различных значений hInstance. Важные уловки, чтобы получить многозадачную операционную систему с графическим интерфейсом, вписанную в 640 килобайт оперативной памяти.

Это перестало быть актуальным 21 год назад с выпуском Windows NT, за которым вскоре последовала Windows 95. Версии Windows, которые сначала поддерживали понятие процесса. Важной концепцией безопасности и стабильности системы является очень сильная изоляция между запущенными программами. Соответственно, актуальность HINSTANCE исчезла, каждый процесс получает одинаковое значение. Псевдо ручка. Почти то же самое для HMODULE, это просто адрес в памяти, куда был загружен модуль.

Соответственно, передача NULL для аргумента hInstance - это нормально. Это означает "текущий процесс", и вы не можете создать окно для другого процесса. И хранение hInstance, которое вы получаете из WinMain() в глобальной переменной, тоже хорошо, есть только одна.

Другие вопросы по тегам