Как получить 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 () в глобальной переменной, тоже хорошо, есть только одна.

4

Другие решения


По вопросам рекламы [email protected]