Вперед объявить HINSTANCE и друзей
Есть ли способ направить-объявить HINSTANCE
тип из WinAPI без включения полного (и большого) windows.h
заголовок?
Например, если у меня есть класс RenderWindow
который владеет HINSTANCE mInstance
я должен буду включить windows.h
в RenderWindow.h
, Так что все что нужно RenderWindow
также должен включать windows.h
,
Я пытался в том числе windef.h
но, похоже, нужны некоторые вещи из windows.h
,:-(Если я не могу заранее объявить это, есть ли хотя бы портативный способ использовать что-то вроде long mInstance
в RenderWindow
вместо HINSTANCE
?
5 ответов
HINSTANCE объявлен в WinDef.h как typedef HINSTANCE__* HINSTANCE;
Вы можете написать в своих заголовках:
#ifndef _WINDEF_
class HINSTANCE__; // Forward or never
typedef HINSTANCE__* HINSTANCE;
#endif
Вы получите ошибки компиляции, ссылающиеся на HINSTANCE, если WinDef.h не включен.
Вы можете объявить его недействительным * и отбросить ошибки. Это близко к бесконечной битве, хотя, рано или поздно, вы получите путаницу. Используйте предварительно скомпилированные заголовки, чтобы не заботиться о размере windows.h
stdafx.h:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
Например, если у меня есть класс
RenderWindow
который владеетHINSTANCE mInstance
я должен буду включитьwindows.h
вRenderWindow.h
, Так что все что нужноRenderWindow
также должен включатьwindows.h
,
Вы смотрели на идиому Пимпл? Это позволяет скрывать частных участников. Побочным эффектом является то, что вам не нужно включать их заголовки в заголовок вашего класса.
Привет @NoSenseEtAl Думаю, мы все еще там.
В 2021 году
HINSTANCE
определяется в . В том числе непосредственно
<minwindef.h>
выдает ошибку: "Нет целевой архитектуры"
Чтобы обойти эту ошибку, выполните следующие действия (при сборке для x64):
#define _AMD64_
#include <minwindef.h>
int main() {
HINSTANCE h;
}
Обратите внимание, что макрос
_AMD64_
не документирован, он начинается с подчеркивания, поэтому не может быть определен пользователем.
И определяется только
<Windows.h>
, поэтому нет заголовка меньшего размера, который можно было бы включить, чтобы он был определен.
Очевидно, есть большая надежда, что Windows SDK будет нормально работать с модулями, поэтому вместо этого можно исправить скорость сборки с помощью модулей.
Лучший портативный способ работы с дескрипторами без заголовка, включая
reinterpret_cast
приведение их к типу точно такого же размера.
Большинство дескрипторов имеют размер указателя 1. Так или пойдет. Примеры:
-
_beginthreadex
возвращаетсяuintptr_t
вместоHANDLE
к нитке. - МСВК
thread::native_handle
возвращаетсяvoid*
Обязательно
static_assert
для размеров шрифта в том месте, где вы видите шрифт.
1 Немногие дескрипторы не имеют размера указателя, я могу вспомнить только тот, который вернул
AcquireCredentialsHandle
.