15

HINSTANCE有没有办法在不包括完整(和大)windows.h标题的情况下从 WinAPI前向声明类型?

例如,如果我有一个RenderWindow拥有 的类HINSTANCE mInstance,我将不得不包含windows.hRenderWindow.h. 所以需要的一切RenderWindow也必须包括windows.h

我试过包括windef.h,但这似乎需要一些东西windows.h。:-(如果我不能转发声明它,是否至少有一种可移植的方式来使用类似long mInstanceinRenderWindow而不是HINSTANCE

4

5 回答 5

9

HINSTANCE 在 WinDef.h 中声明为typedef HINSTANCE__* HINSTANCE;

您可以在标题中写下:

#ifndef _WINDEF_
class HINSTANCE__; // Forward or never
typedef HINSTANCE__* HINSTANCE;
#endif

如果不包含 WinDef.h,您将收到引用 HINSTANCE 的编译错误。

于 2010-04-04T16:57:00.883 回答
6

您可以将其声明为 void* 并将错误丢弃。不过,这接近于一场永无止境的战斗,迟早你会被绊倒。使用预编译的头文件,这样你就不用关心 windows.h 的大小了

stdafx.h:

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
于 2010-04-04T13:51:39.030 回答
3

例如,如果我有一个RenderWindow拥有 的类HINSTANCE mInstance,我将不得不包含windows.hRenderWindow.h. 所以需要的一切RenderWindow也必须包括windows.h

你看过Pimpl 成语吗?这允许您隐藏私人成员。副作用是您不必将它们的标题包含在类的标题中。

于 2010-04-04T13:53:58.437 回答
1

嘿@NoSenseEtAl 我想我们还在那里。

2021 年,HINSTANCE在 中定义<minwindef.h>。包括直接<minwindef.h>给出错误:“No Target Architecture”

要解决该错误,请执行以下操作(假设为 x64 构建):

#define _AMD64_
#include <minwindef.h>

int main() {
    HINSTANCE h;
}

请注意,宏_AMD64_没有记录,它以下划线开头,因此不能由用户定义。

并且它仅由 定义<Windows.h>,因此没有更小的标题可以包含使其定义。

显然,Windows SDK 更有希望与模块一起正常工作,因此可以改为通过模块来修复构建速度。

于 2021-11-23T15:25:15.277 回答
1

处理不包含标题的句柄的最佳可移植方法是将reinterpret_cast它们设置为具有完全相同大小的类型。

大多数句柄的指针大小为1。所以void*uintptr_t将会这样做。例子:

  • _beginthreadex返回uintptr_t而不是HANDLE线程。
  • MSVCthread::native_handle返回void*

确保static_assert在您看到字体的地方输入字体大小。

1很少有句柄没有指针大小,我只能回想起AcquireCredentialsHandle.

于 2021-11-23T15:36:37.943 回答