DelphiはC/C++インクルードファイルをまったく使用しないため、Windows SDKがIDEに同梱されているかどうかは関係ありません.Delphiプロジェクトでは使用されません。さて、もしDelphiがのCヘッダファイルのパスフレーズを提供していないことを心配しているなら、それは別の話です。
#ifdef STRICT
typedef void *HANDLE;
#if 0 && (_MSC_VER > 1000)
#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name
#else
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
#endif
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
STRICT
は、より型安全性を提供:
DECLARE_HANDLE()
は、入力パラメータの値とプリプロセッサSTRICT
の条件が定義されているか否か基づいて、新しいデータ型の別名を宣言するCプリプロセッサマクロですC/C++コード。多くのWin32ハンドルタイプは、ユーザーコードでは不透明な型です。 DECLARE_HANDLE()
を使用してそれらを宣言すると、コンパイラはSTRICT
が定義されているときにそれらを異なるデータ型として扱うことができるため、さまざまなハンドル型が誤って混在することを防ぎます(HWND
が期待されるところなどHBITMAP
を渡します)。 STRICT
が導入される前に、多くの開発者がこの種の間違いを犯しました。すべてのハンドルタイプが実質的にだったため、コンパイル時の検証はできませんでした。
これはDECLARE_HANDLE(DPI_AWARENESS_CONTEXT)
は、このようなDPI_AWARENESS_CONTEXT
を宣言することを意味します:
STRICT
が定義されている場合:
struct DPI_AWARENESS_CONTEXT__{int unused;};
typedef struct DPI_AWARENESS_CONTEXT__ *DPI_AWARENESS_CONTEXT;
STRICT
が定義されていないとき:
typedef void* DPI_AWARENESS_CONTEXT;
DPI_AWARENESS_CONTEXT
はのポインタ、タイプのポインタ、STRICT
に応じてポインタとして宣言されています。
この種の名前解決は、C/C++のようなプリプロセッサマクロをサポートしていないため、Delphiには変換できません。
type
{$IFDEF STRICT}
DPI_AWARENESS_CONTEXT__ = record
end;
DPI_AWARENESS_CONTEXT = ^DPI_AWARENESS_CONTEXT__;
{$ELSE}
DPI_AWARENESS_CONTEXT = Pointer;
{$ENDIF}
それとも単にDelphiで完全STRICT
の存在を忘れて::最も近い訳はなく、直接DPI_AWARENESS_CONTEXT
を宣言するだろうDPI_AWARENESS_CONTEXT
が宣言されると
type
DPI_AWARENESS_CONTEXT__ = record
end;
DPI_AWARENESS_CONTEXT = ^DPI_AWARENESS_CONTEXT__;
いずれかの方法を、あなたはその定数を宣言することができます値:
const
DPI_AWARENESS_CONTEXT_UNAWARE = DPI_AWARENESS_CONTEXT(-1);
DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = DPI_AWARENESS_CONTEXT(-2);
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = DPI_AWARENESS_CONTEXT(-3);
更新:コメントに基づいて、あなたは、代わりに代わりにこれを使用することができます。これらの定数のみGetThreadDpiAwarenessContext()
からSetThreadDpiAwarenessContext()
に、NOT出力のために入力するために使用されていることを
type
DPI_AWARENESS_CONTEXT = type THandle;
const
DPI_AWARENESS_CONTEXT_UNAWARE = DPI_AWARENESS_CONTEXT(-1);
DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = DPI_AWARENESS_CONTEXT(-2);
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = DPI_AWARENESS_CONTEXT(-3);
注意を。後者は、不透明なハンドルをプライベートメモリ構造体に返します。その構造から実際のDPI_AWARENESS
値を取得するには、を使用する必要があります。
以下に述べるように、これらの「マジックナンバー」は、それぞれの条件でGetThreadDpiAwarenessContextから返される値です。また、SetThreadDpiAwarenessContextで動作し、期待された/望ましい結果を達成します。 –
私はこの宣言を理解できません:https://msdn.microsoft.com/en-us/library/windows/desktop/mt791579(v=vs.85).aspx。宣言されたものは何ですか?これはenum、構造体、配列なのですか? 'typedefハンドルxxx {aaa、bbb、ccc} Txxx;'のようなものです。それはどんな宣言ですか? –
@Rudyだから私は実際の宣言のためにSDKで掘ったのです。私は明らかに欠落してしまった - 基本的にこれらの定数のそれぞれは、ハンドルに負の整数キャストだけです。 –