0

以下のコードをコンパイルすると、エラーなしで完了しますが、セットアップファイルを実行しようとすると、タイプの不一致エラーが発生します。誰かがそれを引き起こしている可能性があるものを教えてもらえますか?(正確なエラーメッセージは「ランタイムエラー(1:66):タイプの不一致」です。)

[Setup]
DefaultDirName={code:AppDir}\MyApp

[Code]
function AppDir(Param: String): String;
var
 Check: Integer;
begin
 Check := GetWindowsVersion();
 if Check = 6.0 then
 Result := ExpandConstant('{userdocs}')
 else
 Result := ExpandConstant('{pf}');
end;
4

1 に答える 1

2

InnoSetupのドキュメントからの引用GetWindowsVersion()

単一の整数にパックされたWindowsのバージョン番号を返します。上位8ビットはメジャーバージョンを指定します。次の8ビットはマイナーバージョンを指定します。下位16ビットはビルド番号を指定します。たとえば、この関数は、バージョン5.0.2195であるWindows2000で$05000893を返します。

浮動小数点値と比較することはできません。次のように、バージョン番号の一部を抽出する必要があります。

function AppDir(Param: String): String;
var
  Ver: Cardinal;
  VerMajor, VerMinor, BuildNum: Cardinal;
begin
  Ver := GetWindowsVersion();
  VerMajor := Ver shr 24;
  VerMinor := (Ver shr 16) and $FF;
  BuildNum := Ver and $FFFF;

  if VerMajor >= 6 then
    Result := ExpandConstant('{userdocs}')
  else
    Result := ExpandConstant('{pf}');
end;

同等性をチェックすることは絶対にしないでくださいVerMajor。これは、Windowsのバージョンが低いか高いかで失敗するためです。常に<=または>=代わりに使用してください。

于 2010-02-05T07:50:45.397 に答える