Вперед объявить 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.

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