10

ターゲット プラットフォーム 64 ビット Windows 用の Delphi XE2 で次のコードをコンパイルすると ...

function HKeyToString(_HKey: HKey): string;
begin
  case _HKey of
    HKEY_CLASSES_ROOT: result := 'HKEY_CLASSES_ROOT'; // do not translate
    HKEY_CURRENT_USER: result := 'HKEY_CURRENT_USER'; // do not translate
    HKEY_LOCAL_MACHINE: result := 'HKEY_LOCAL_MACHINE'; // do not translate
    HKEY_USERS: result := 'HKEY_USERS'; // do not translate
    HKEY_PERFORMANCE_DATA: result := 'HKEY_PERFORMANCE_DATA'; // do not translate
    HKEY_CURRENT_CONFIG: result := 'HKEY_CURRENT_CONFIG'; // do not translate
    HKEY_DYN_DATA: result := 'HKEY_DYN_DATA'; // do not translate
  else
    Result := Format(_('unknown Registry Root Key %x'), [_HKey]);
  end;
end;

... HKEY_-Constants ごとに警告が表示されます:「W1012 定数式がサブ範囲の境界に違反しています」

Winapi.Windows で宣言を確認しました (識別子を Ctrl+Leftclick で):

type
  HKEY = type UINT_PTR;
{...}
const
  HKEY_CLASSES_ROOT     = HKEY(Integer($80000000));

これらは私にはうまく見えます。コンパイラがまだ問題があると考えるのはなぜですか?

4

2 に答える 2

11

64 ビット コンパイラでは、 の実際の値HKEY_CLASSES_ROOTは次のとおりです。

FFFFFFFF80000000

これは、へのキャストが負の数になるためIntegerです80000000。そして unsigned への変換はFFFFFFFF80000000. この値は正しいことに注意してください。Windows ヘッダー ファイルの宣言は次のとおりです。

#define HKEY_CLASSES_ROOT (( HKEY ) (ULONG_PTR)((LONG)0x80000000) )

また、ヘッダー ファイルをインクルードHKEY_CLASSES_ROOTして C++ プログラムで の値を調べると、Delphi 宣言とまったく同じ値になります。

そして、case ステートメント内のセレクターは次のようにしかできないと述べている Delphi ドキュメントからパズルを解くことができます。

32 ビットより小さい序数型の任意の式

caseステートメントをステートメントに置き換えるしかありませんif

于 2013-02-01T13:39:30.913 に答える