Как сделать параметр одной функции видимым для остальных функций?
В языке C++ можно создать глобальную переменную с тем же именем (hInstance) и потом внутри функции WinMain с помощью оператора разрешения контекста присвоить глобальной переменной hInstance значение параметра hInstance функции WinMain:
А как быть в языке C, в котором пространства имен нет?
то ты: "Вот только не хочется плодить переменные" и тут же создаешь ее
а что мешает передавать эту переменную в нужную функцию ?
{
hInstance = hInst;
// ...
}
HINSTANCE * phInstance;
INT WINAPI WinMain(HINSTANCE hInstance, ...)
{
phInstance = &hInstance;
...
}
void foo()
{
MyFunc(*phInstance);
...
}
А теперь сравни:
HINSTANCE * phInstance;
INT WINAPI WinMain(HINSTANCE hInstance, ...)
{
phInstance = &hInstance;
...
MyFunc(*phInstance);
}
и
HINSTANCE hInstance;
INT WINAPI WinMain(HINSTANCE hInst, ...)
{
hInstance = hInst;
// ...
MyFunc(hInstance);
}
Какой код понятнее и короче?
Ай-ай-ай, а как же конструкторы/деструкторы глобальных объектов? Или, если говорить про язык C, то функции, переданные в atexit()? Они же не смогут проконтролировать, когда и откуда их вызвали. Может получиться гейзенбаг :)
Вообще ради hInstance такое городить не стоит. Всегда же можно вызвать GetModuleHandle( 0 ).
И большое спасибо, tarekon, за GetModuleHandle(). В который раз убедился, что где-то в недрах WinAPI непременно есть та самая функция, которая нужна в данном случае.
Интересно, где это я ввожу дополнительную переменную в сравнении с другим кодом? Ты называешь переименование параметра функции вводом дополнительной переменной?
INT WINAPI WinMain(HINSTANCE hInst, ...)
{
hInstance = hInst;
...
}
Просто изначально интересно было, можно ли сделать параметр hInst (локальную для функции WinMain переменную) видимым для других функций в этом же файле. Без введения любых других переменных.
Ты думаешь этот код будет работать без дополнительной переменной?
Ну и конечно куда проще везде писать GetModuleHandle(0), чем hInstance.
Кроме того, я же безо всякой иронии согласился, что:
А насчет GetModuleHandle() - я, например, не знал, что можно получить значение hInstance иначе, кроме как из передаваемого в функцию WinMain параметра. Не знаю как насчет производительности, но в данном конкретном случае эта функция действительно заменяет создание новой глобальной перменной :)
GetModuleHandle(NULL) возвращает хендл (базовый адрес) модуля первым загруженный в процесс (т.е. основного модуля, обычно это хендл образа запущенного EXE), а не хендл модуля из которого происходит вызов ф-ции GetModuleHandle.
Т.е. если ты вызовешь GetModuleHandle(NULL) из кода DLL (или другого неосновного модуля), то получишь хендл не этой DLL, а на основного модуля.