Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2008年10月08日] [更新 2019年04月13日] Delphi 一般・その他
   
Windows Vista 以降の OS で Delphi
動作確認等 Windows Vista, Windows 7, Windows 8/8.1, Windows 10 を対象とした記事
[整理番号 - 0310]



  • 2018年07月16日 (これより前の履歴は省略)
  • BDE 関係,HLP 形式のヘルプファイル関係,アプリケーションマニフェスト関係の記事を別ページを作成して移動




Windows Vista 以降の OS での使用


Windows Vista 以降,OS の仕様にいろいろな変更がありました.コンポーネントやサンプルコードが動作しなかったり,動作しても正しい結果が得られないことがあります.
プログラマー側から見た大きな変更として,プログラムの実行権限に関する「UAC (ユーザアカウント制御)」と「レジストリとファイルの仮想化」機能があります.UAC が有効の時は,ユーザーインターフェイス特権の分離 (UIPI) により,メッセージ関係の処理にも注意が必要です.

以下の最初のリンクの記事には重要なことが書かれています.本ページでは,それらの内容には直接触れていません.各自で確認してください.



ユーザーインターフェイス特権の分離 (UIPI) については,下記の記事も参考にしてください.フックやドラッグ・アンド・ドロップは UIPI の影響を受けるメッセージ処理の 1 つです.


[備考]
当サイトの記事は全て,UAC を有効にした状態での操作に関する内容となっています.以前は,本ページ以外にも,UAC が無効の場合についての文章を随所に記述していましたが,現在は全て削除しています.
UAC を無効にすると,管理者権限ではできない操作が可能になる一方で,UAC が無効の状態だと操作できない機能もあります.UAC を無効にすることと,管理者権限の付与とは,必ずしも同じというわけではありません.




01_管理者でログインしても管理者権限での実行にはならない


Windows XP までは,管理者でログインすれば,そのまま管理者権限の操作ができました.
Windows Vista 以降では,たとえ管理者でログインしても標準ユーザ (一般ユーザー) 以下の権限しかありません.管理者でログインとは,必要な時に管理者に昇格可能という意味となっています.

管理者に昇格するには,メニューから [管理者として実行] を選択します.



図1
[管理者として実行]
  • 管理者権限での実行となる




02_インストールも IDE の起動も管理者権限が必要


レジストリの操作やシステムフォルダの操作には管理者権限を必要とします.
Delphi だけでなく,多くのアプリケーションのインストールにはレジストリやシステムフォルダの操作を伴います.したがって管理者権限が必要です.
もちろん管理者権限を必要としないものもあります.それはアプリケーションによります.

Windows Vista 以降の UAC に対応していないアプリケーション類は,下図のように [管理者として実行] で実行しないと,管理者権限で実行してくれません.管理者権限で実行しないと,Windows Vista 以降に採用された「レジストリとファイルの仮想化」機能によって,必要なファイルが別の場所に格納されてしまい,それらのファイルを認識できないことが原因のトラブルが発生することになります.

Delphi 2007 以降のインストーラは [管理者として実行] で実行する設定になっています.もちろんこの方法で実行してもかまいません.
自作のアプリケーションで,起動時に [ユーザーアカウント制御] ダイアログを自動的に表示するようにできます.それには,アプリケーションマニフェストを EXE に組み込みます.


[備考 1]
インストールに管理者権限が必要なアプリケーションは,管理者権限でインストールします.
実行時に管理者権限が必要なアプリケーションは,管理者権限で実行します.
インストールや実行時に管理者権限が必要であるかどうかは,そのアプリケーションによります.
Delphi は,インストールも実行時にも管理者権限が必要なアプリケーションです.
管理者権限で実行するには,[管理者として実行] で実行します.

[備考 2]
Windows Vista 以降では,プログラムがインストーラの時は UAC の影響を受けます.
実行ファイル名に SETUP, INSTALL, UPDATE 等の文字列が含まれている場合,それらはインストーラとみなされます.


[備考 3]
Windows Vista 以降に対応していいるバージョンの Delphi の IDE は,管理者権限で起動しなくても利用できるようになっています.ただし,コンポーネントのインストールや追加等,管理者権限で IDE を起動していないと正常にインストールや追加ができないことがあります.



図2
管理者権限でインストール開始
  • DVD の自動再生で開始された場合は,一度閉じる
  • Delphi の DVD の Install.exe を実行
  • これは Delphi 7 Pro の DVD のファイル
図3
ユーザーアカウント制御
  • Windows 7 で [管理者として実行] で実行した場合
図4
ユーザーアカウント制御
  • Vista で [管理者として実行] で実行した場合
  • 当然 [許可] を選択

上の図は [管理者として実行] で実行した場合のダイアログですが,標準ユーザのまま起動すると次のようなダイアログとなります.

例えば,当サイトのプログラム類をダウンロードして,アプリケーションである EXE を起動するとセキュリティの警告,「発行元が確認できませんでした」のダイアログが現れるこがあります.これを回避するためには,提供者である筆者がデジタル署名を取得する必要があります.
自分の環境でコンパイルし直せば,現れなくなります.


図5
セキュリティの警告
  • デジタル署名を取得していないアプリを管理者に昇格しないで起動した場合
図6
ユーザアカウント制御
  • デジタル署名を取得して,管理者権限で実行するように作成したアプリの場合
  • UAC に対応したアプリはこのダイアログが表示される
  • 自作アプリでこのダイアログを表示するには [コードサイニング証明書] の取得が必要

Windows Vista 以降に対応していないアプリケーションの場合は,下図のような [プログラム互換性アシスタント] ダイアログが表示される場合があります.
このダイアログが現れるアプリケーションは,このまま実行して,正常に動作しない場合でも,[互換モード] であれば動作可能なようです.このダイアログは非表示にもできます.

このダイアログでは当然 [プログラムを実行する] をクリックして続行します.[オンラインで解決策の有無を確認する] にしても解決はできません.



図7




03_ショートカットを作成して管理者権限で起動


管理者権限が必要なアプリケーションは,「管理者として実行」で実行します.そうしないと,たとえエラーが発生しなくても正常に動作するとは限りません.そのため,デスクトップ等にショートカットを作成して常に [管理者として実行] 可能なようにしておくと便利です.
この設定をして Delphi を起動すると [ユーザーアカウント制御] のダイアログが現れます.



[備考]
次項の説明のように,Delphi の大元の EXE を管理者権限で実行するように設定すれば,ショートカットのプロパティの設定は不要です.


図8
起動用ショートカットの作成
  • [コピー] して,デスクトップ等に [ショートカットの貼り付け]
  • ここでは,Delphi 7 起動用のショートカットを作成
図9
起動ショートカットの設定
  • ショートカットのプロパティを開く
  • [ショートカット] タブの [詳細設定]
  • [管理者として実行] にチェック




04_プロジェクトを常に管理者権限で起動できるようにする


Delphi のプロジェクト (拡張子 .dpr) を開く際,拡張子の関連付けをしていても,ダブルクリックで開いてしまうと,[管理者として実行] での実行にならない場合があります.
[管理者として実行] で Delphi を起動して,IDE のメニューからプロジェクトを開くか,上記の説明で作成した Delphi のショートカットに,ドラッグ・アンド・ドロップして開くようにします.

下図のように,Delphi の EXE そのものを管理者権限で起動するように設定しておくと,プロジェクトをダブルクリックで開く際,自動的に管理者への昇格ダイアログ ([ユーザアカウント制御] ダイアログ) を表示することができます.
また,[スタート] メニューから Delphi を起動する際も,[管理者として実行] の操作をする必要がなくなります.



図10
IDE の EXE のプロパティ変更
  • Delphi インストール先の [bin] フォルダ内の bds.exe のプロパティダイアログを表示
  • [互換性] のタブで [管理者としてこのプログラムを実行する] をチェックする
  • この図は Delphi XE の場合

上図の設定をして Delphi のショートカットを作成すると, 下図のように,管理者権限で実行するという意味の「盾」付きのアイコンになります.



図11
ショートカットを作成すると自動的に盾アイコンが付く

上記の設定内容は,レジストリの以下の場所に記録されます.レジストリの,この値を編集することによっても,管理者権限での起動の設定ができます.
このレジストの場所は,Windows XP 等の互換モードを設定した場合に,その設定が記録される場所と同じです.



HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers


図12

[備考 1]
後述の [互換モード] の設定をしている場合は,ダブルクリックすると,自動的に [ユーザアカウント制御] ダイアログが表示され,管理者への昇格を問い合わせてきます.

[備考 2]
違うバージョンの Delphi で作成したプロジェクトを開く時にエラーが発生することがあります.これはまた別の問題です.




05_IDE 上での実行と EXE 単独起動の違い


Delphi を [管理者として実行] で起動し,IDE 上でコンパイルして実行する場合は,既に管理者として実行しています.作成した EXE を直接実行した時と動作が異なることもあることに注意します.

作成した EXE に管理者権限が必要な動作が含まれている場合,その EXE は管理者権限で実行しなければなりません.実行時にたとえエラーが発生しなくても,正常に動作するとは限りません.

実行時に管理者権限が必要かどうかは,そのプログラムの作成,開発者,つまりプログラマーが把握しなければなりません.
アプリケーション全体ではなく,あるボタンクリックで管理者権限で実行する場合,そのボタンに,管理者権限で実行するという意味の「盾アイコン (シールドアイコン)」を表示できます.
ElevationRequired プロパティを True にします.このプロパティは Delphi 2009 以降にあります.



図13
「盾」アイコン表示用のプロパティ

盾 (シールド) アイコンが別途必要であれば,システムのリソースから取得できます.
下のコードは,その取得コードの例です.



図14
シールド (盾) アイコン

リスト1
uses
  ShellAPI;

{$R *.dfm}

//-----------------------------------------------------------------------------
//  システム関係のアイコンを取得する関数
//  usesにShellAPIが必要
//-----------------------------------------------------------------------------
function GetStockIcon(Id: Integer; ASize: Cardinal; AIcon: TIcon): HRESULT;
var
  LSHIconInfo : TSHStockIconInfo;
  LuFlags     : Cardinal;
  LResCode    : HResult;
begin
  Result := 0;
  LSHIconInfo.cbSize := SizeOf(LSHIconInfo);

  LuFlags  := SHGSI_ICON or ASize;
  LResCode := SHGetStockIconInfo(id, LuFlags, LSHIconInfo);

  Result := LResCode;
  if Result = S_OK then AIcon.Handle := LSHIconInfo.hIcon;
end;

//=============================================================================
//  システムの盾(シールド)アイコン画像を取得する
//  必要であればビットマップ画像等に変換して使用する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LIcon : TIcon;
begin
  LIcon := TIcon.Create;
  try
    //大きいアイコン
    if GetStockIcon(SIID_SHIELD, SHGSI_LARGEICON, LIcon) = S_OK then begin
      Image1.Canvas.Draw(0, 0, LIcon);
    end;
    //小さいアイコン
    if GetStockIcon(SIID_SHIELD, SHGSI_SMALLICON, LIcon) = S_OK then begin
      Image1.Canvas.Draw(50, 0, LIcon);
    end;
  finally
    FreeAndNil(LIcon);
  end;
end;




06_自アプリが管理者権限で実行しているか確認する方法


実行中のプログラムが管理者権限で実行されているかは,IsUserAnAdmin 関数を使用して確認できます.この関数は,Windows Vista までのサポートとなっていますが,Windows 7, 8.1, 10 でも使用可能であることを確認しています.
CheckTokenMembership という関数もあります.こちらは特にサポート上限のについての記述はないようです.CheckTokenMembership 関数は,Delphi XE6 までに定義はありませんが,JEDI API には実装されています.



リスト2
管理者権限で実行しているかの確認用コードの例
IDE が管理者権限で起動していかるかの確認には利用できない
uses
  Registry;

{$R *.dfm}

  //IsUserAnAdminはDelphi2010以降には実装されている
  //Delphi2010以降では,usesにShlObjを追加すれば,この定義文は不要
  function IsUserAnAdmin: Boolean; stdcall; external 'Shell32.dll';

//=============================================================================
//  以下の状態を調べるコード
//  (1) UACが有効か無効かを調査
//  (2) 管理者権限での実行か非管理者権限での実行かを調査
//
//  TRegistryの使用にはusesにRegistryが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LRegistry : TRegistry;
  LRegKey   : String;
  LRegItem  : Integer;
begin
  if DebugHook <> 0 then begin
    MessageBox(Handle, 'デバッグ中は調査しません', '情報', MB_ICONINFORMATION);
    exit;
  end;


  LRegistry := TRegistry.Create;
  try
    LRegistry.Access  := KEY_READ;
    LRegistry.RootKey := HKEY_LOCAL_MACHINE;
    LRegKey := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System';

    if not LRegistry.OpenKey(LRegKey, False) then begin
      MessageBox(Handle, 'UAC が無効の状態です', '情報', MB_ICONINFORMATION);
    end else begin
      LRegItem := LRegistry.ReadInteger('EnableLUA');

      if LRegItem = 0 then begin
        MessageBox(Handle, 'UAC が無効の状態です', '情報', MB_ICONINFORMATION);
      end else begin
        if IsUserAnAdmin then begin
          //管理者権限で実行中
          MessageBox(Handle, '管理者権限で実行中', '情報', MB_ICONINFORMATION);
        end else begin
          //管理者権限以外で実行中
          MessageBox(Handle, '標準ユーザで実行中', '情報', MB_ICONINFORMATION);
        end;
      end;
    end;
    LRegistry.CloseKey;
  finally
    FreeAndNil(LRegistry);
  end;
end;




07_コマンドラインで DLL や ActiveX 登録も管理者権限が必要


コマンドラインも,管理者権限が必要な操作は管理者としての実行が必要です.
例えば,regsvr32.exe で DLL や OCX (ActiveX コントロール) を登録する時等です.
regsvr32.exe はレジストリの操作ですから,当然,管理者権限での実行が必要です.

アプリケーションでコマンドラインの操作が必要な場合は,サンプルプログラム集に以下の様な参考コードと記事があります.



[備考 1]
DLL や OCX (ActiveX コントロール) には 32 ビット版と 64 ビット版があります.
32 ビット版の DLL 等は 64 ビットのアプリケーションでは使用できません.64 ビット版の DLL 等は 32 ビットのアプリケーションでは利用できません.32 ビット版の DLL 等の登録は,基本的には 32 ビット版のコマンドプロンプトを管理者権限で起動して行うことになります.


[備考 2]
エクスプローラからフォルダやファイル名をドラッグ・アンド・ドロップすれば,コマンドプロンプトにそのフォルダ名等を貼り付けることができます.この時,パス名に空白文字ある場合,自動的に " (ダブルクォーテーション) が付加されます.
この機能は,コマンドプロンプトを管理者権限で起動している時は無効となります.



下図の [スタート] メニューから起動するのは,Windows が 64 ビット版の場合,64 ビット版のコマンドプロンプトです.
[スタート] メニューからコマンドプロンプを起動する時,[Ctrl] と [Shift] キーを押した状態でマウスクリック,あるいは [Enter] キーで起動すると,管理者権限での起動となります.
他のアプリを [スタート] メニューから起動する時も同じです.



図15
コマンドプロンプトの起動
  • Windows 7 の場合
  • [管理者として実行] で実行
  • 64 ビットの Windows 7 では 64 ビット版のコマンドプロンプトが起動する
図16
コマンドプロンプトの起動
  • Windows 8.1 の場合
  • 画面左下のウィンドウのロゴのポップアップメニューから起動可能

Windows 8.1, Windows 10 では下図のように,エクスプローラの [ファイル] のメニューからコマンドプロンプトを管理者権限で起動できます.
下図は,ドライブ C (システムドライブ) を選択して [ファイル] をクリックした状態です.



図17
エクスプローラのメニューからコマンドプロンプトを起動
  • Windows 8.1 の場合
図18
エクスプローラのメニューからコマンドプロンプトを起動
  • Windows 10 の場合

実際の Windows 7 のコマンドプロンプトの起動画面です.管理者権限で起動すると,キャプション (タイトル) に「管理者」という文字が表示されます.



図19
標準ユーザのコマンドプロンプト
  • キャプションが [コマンド プロンプト]
  • 管理者でログインしても [管理者として実行] で実行しなければ,これになる
図20
管理者のコマンドプロンプト
  • [管理者として実行] で実行した場合は,キャプションが[管理者: コマンド プロンプト]

下図は,以下のサンプルプログラムを [管理者として実行] して,コマンドラインのコマンドを実行する例です.
このサンプルは,32 ビットのアプリとして作成すれば,32 ビット版のコマンドを実行できます.64 ビットのアプリとして作成すれば,64 ビット版のコマンドを実行できます.



図21
コマンドラインの実行例
  • [管理者として実行] してコマンドラインを設定
  • [管理者として実行] で実行しなくても成功することもあるが,正常に登録されるとは限らないので注意
  • 例は,regsvr32 "D:\000\XlsCrt2.DLL"

コマンドプロンプトにも,下図のように,コピーや貼り付けの機能があります.
編集のメニューは,ウィンドウの左上のシステムメニューの [編集] から,または,コマンドプロンプトの任意の位置のマウスの右ボタンクリックで表示できます.


図22
コピーや貼り付けの機能
  • Windows 10 では [Ctrl] + [C] で貼り付けが可能
図23
ポップアップメニュー

以下の記事に,コマンドプロンプトに貼り付け操作を行うサンプルがあります.





08_msi インストーラを管理者権限で実行する方法


拡張子が .msi のファイルは実行形式のファイルではありません.
msi 形式のファイルには,[管理者として実行] の項目はありません..msi 形式は,msiexec に関連付けされたファイルです.

管理者権限が必要なアプリケーションのインストーラが msi 形式で提供されている場合,次のようなパッチファイルを作成して,このパッチファイルを [管理者として実行] で実行することでインストールできます.
デジタル署名 (コードサイニング証明書) があるアプリケーション,あるいは管理者権限での実行が必要でないアプリケーションであれば,.msi ファイルを直接実行できます.


msiexec /i msiファイルのフルパス





09_アンインストールも管理者権限で実行する


Delphi 2007 よりも前の Delphi のように,Vista の UAC 未対応のアプリケーションのアンインストールも [管理者として実行] で実行して,管理者権限で行います.そうしないと正常にアンインストールできない場合があります.
Vista の UAC に対応しているアプリケーションでは,[コントロールパネル] の [プログラムと機能] からアンインストールできます.また,専用のアンインストーラーが用意されている場合もあります.
自作のアプリケーションにアンインストーラーを実装する時は注意が必要です.

Delphi 6, 7 では,Install.exe を [管理者として実行] すれば,アンインストールできます.



[備考]
何かのトラブル回避策として Delphi をアンインストールする際には,レジストリの削除も行う必要があります.そうしないと,関係する情報がレジストリに残ってしまいます.そのため,再インストールしてもトラブルの回避策にならないことがあります.
アンインストールでは,レジストリの情報を削除するかの選択項目がありますが,以下のリンクの記事も参考にしてください.

また,レジストリと Program Files (Program Files (x86)) 以外にも,関連フォルダやファイルも削除することをお勧めします.
トラブルが発生して,再インストールが必要な場合は特にこの作業が重要です.再インストールとは,システムの状態を,そのアプリなりソフトを新規にインストールする時と極力同じにする,と捉えるとよいのではないかと思われます.



図24
アンインストール
  • Vista の UAC 未対応のアプリでは正常にアンインストールできない場合がある




10_管理者に昇格しないで実行してしまった場合 ( 仮想化の問題 )


Vista 以降の UAC に対応していないアプリケーションでは,管理者に昇格しないでインストールやアンインストールを実行,あるいは,設定の変更操作してしまった場合,改めて [管理者として実行」で実行して,これらの操作を行ったとしても正常に動作しない場合があります.
正常に動作するように見えても,設定変更や他のユーティリティ類導入後の動作に問題が発生することがあります.
これは,Windows Vista 以降の「ファイルとレジストリの仮想化」機能によるものです.このような場合はマイクロソフトの以下のページを参考にして対処する以外にありません. 上のリンク先のページにある [互換性ファイル] は,下図の説明のようにして閲覧することができます.[互換性ファイル]は,仮想化機能によって作成された仮想化フォルダやファイルのことです.具体的には以下の場所となっています.
なお,この「ファイルとレジストリの仮想化」は,64 ビットアプリケーションでは使われません.

%LOCALAPPDATA%\VirtualStore


図25
互換性ファイル 1
  • 全てのファイルの表示が可能な状態にしておく
  • [互換性ファイル] をクリック
  • この図は Windows 7
図26
互換性ファイル 2
  • 右ペインに互換性ファイルだけが表示される
  • この中に仮想化ファイルがある
図27
互換性ファイル 3
  • 上の図で,右ペインのフォルダのどれかをマウスで選択する
  • 実際に存在する場所が,左ペインで選択状態になる
図28
レジストリでの場所
  • [Classes] のツリーは一部省略
  • 正常インストールでない場合,アンインストール後,仮想ファイルとこのレジストリの該当キーも削除する必要がある (存在すれば)




11_ファイルの仮想化と設定関係ファイル ( バーチャルストア )


前項の説明と重複しますが,Program Files フォルダ階層下のファイルは,管理者権限でないと,変更等の操作はできません.

例えば,プログラムの設定関係ファイル等を,どこからか持ってきてコピーしても,反映されないことがあります.そのようなファイルが存在している場合,アプリケーションから設定した内容を保存する際にアクセス拒否等のエラーが発生しない場合があります.この時,設定した内容は,前項で説明した仮想化ファイルに保存されます.これを「バーチャルストア」と言うことがあります.

前項の図で分かるように,Windows 等のシステム関係のフォルダ内のファイルも,ファイルの仮想化の影響を受けます.



Windows Vista ではセキュリティの観点からファイルのアクセス制限が厳しくなりました.
そのため,レジストリや Program Files 等,システムに関わるフォルダ内のファイルを操作する古いアプリケーションが動作しなくなることがあります.これを回避するために実装されたのがファイルの仮想化 (バーチャルストア) の機能です.

Windows XP までは,一般ユーザでもそれらのフォルダへの書き込みが可能でした.しかし,アプリケーションの開発者に悪意があれば,システムをどうにでも変更できてしまい危険です.そこで Vista では一般ユーザを制限するようになりました.その代わり,バーチャルストア (VirtualStore) という別のフォルダに保存します.
古いアプリケーションの中には,バーチャルストアを使用する動作では問題が発生することがあります.その場合は,別の場所にインストールし直すとか,管理者権限で利用することになります.
ただし,バーチャルストアが有効な状態の時は,アプリケーションがエラーを報告しなくなるため,発生する問題に気が付ないこともあります.

古いアプリケーションの中には,管理者権限で利用すると,エクスプローラからのドラッグ & ドロップの機能等が利用できなくなることがあります.





12_システム的にファイルの仮想化を無効にする方法


開発するアプリケーションでアプリケーションマニフェストを使用すれば,そのアプリケーションではファイルの仮想化を無効にできます.
システム的にファイルの仮想化 (バーチャルストア) を無効にするには,[スタート] の [検索の開始] または [ファイル名を指定して実行] のダイアログで, 以下のコマンドを実行して下図の [ローカルセキュリティポリシー] の設定画面を表示します.


secpol.msc /s

  • (1) 左ペインの [ローカルポリシー] を展開して [セキュリティポリシー] を選択
  • (2) 右ペインの [ユーザー アカウント制御:各ユーザーの場所へのファイルまたはレジストリの書き込みエラーを仮想化する] をダブルクリックする
  • (3) 表示されたダイアログで,[無効] を選択してダイアログを閉じる

そしてコンピュータを再起動します.

バーチャルストアを無効にすると,古いアプリケーションの中には,正常にインストールできなかったり,正常に実行できなくなることがあります.その場合は,別の場所にインストールし直します.それでも問題が発生する場合は管理者権限で実行します.問題が発生して,起動したアプリケーションが終了できなくなった場合は,タスクマネージャーを起動して強制終了させます.
古いアプリケーションの中には,管理者権限で利用すると,エクスプローラからのドラッグ & ドロップの機能等が利用できなくなることがあります.



図29




13_プログラム互換性アシスタントのダイアログ


実行可能なファイルの名前に Install, setup や update 等があるファイルを実行して終了すると,下図のようなダイアログが現れることがあります.このダイアログが現れても,通常は [このプログラムは正しくインストールされました] を選択して閉じて問題はありません.

この [プログラム互換性アシスタント] ダイアログは,[ローカルグループポリシーエディタ] を起動して,[管理用テンプレート] [Windows コンポーネント] [アプリケーションの互換性] の [アプリケーションの互換性エンジンをオフにする] の設定を [有効] にすると,Windows を再起動すれば表示しなくなります.

アプリケーションマニフェストに,<compatibility> 要素を追加して,該当する Windows のバージョンの <supportedOS Id= の記述を追加すれば,このプログラム互換性アシスタントのダイアログは現れません.
こういうことからも配布するアプリケーションにはアプリケーションマニフェストが必要と言えます.



図30
[プログラム互換性アシスタント] ダイアログの例
図31
[プログラム互換性アシスタント] のダイアログが現れないようにする




14_システム関係フォルダや特殊フォルダの操作には要注意


アプリケーションで,システム関係のフォルダや特殊フォルダにアクセスする場合,コードで直接絶対パスを指定しないようにします.絶対パスが必要な場合は,実行時に絶対パスに変換にします.
これは,Windows Vista 以降に限りません.Windows XP 以前でも同じです.

絶対バスを使用してしまうと,別のバージョンの Windows や別のコンピュータで実行したり,あるいは別のユーザが操作すると正常に動作しなくなる場合があります.また,32 ビット版の Windows では正常に動作していたアプリが,64 ビット版の Windows では正常動作しない現象が発生することがあります.当然その逆の現象が発生することも考えられます.



ファイルへのアクセス拒否は上記の参考リンクの記事以外にも,該当するファイルが他のプロセス (プログラム) で実行中または使用中の時も発生することがあります.
例えば GDI+ を使用して画像ファイルを操作する際,その画像ファイルを他のプロセス (プログラム) でも使用可能なコーディングをしておかないとアクセスが拒否されることがあります.





15_互換モードでのプログラム実行


アプリケーション類のインストールに失敗する場合,[互換モード] を [Windows XP (Service Pack 3)] に設定して実行するとほとんど成功するようです.筆者は動作確認していません.Delphi 6 と 7 のインストール後にこの設定でも動作することは確認しました.この設定をすると,[管理者として実行] から実行しなくても [ユーザアカウント制御] ダイアログが表示されます.
この場合,Windows XP の互換モードで動作させることになりますが,これは [XPモード] で動作することではありません.

この [互換モード] での Delph と,ネイディブな環境で起動する Delphi とでは,動作仕様が異なることがあります.


[備考]
64 ビット版の Windows Vista 以降でも,今までの 32 ビットのアプリケーションは,基本的には動作します.64 ビット版の Windows には,32 ビットのアプリケーションを動作させるための仕組みが実装されています.
筆者は,Windows XP 時代に使用していた 32 ビットのアプリケーションをインストールして使用していますが,現在のところ全て問題なく動作しています.互換モードを利用しているアプリケーションは全くありません.



図32
互換モードの設定
  • 実行ファイルのショートカットを作成して [プロパティ] を表示
  • 念のため [特権レベル] にもチェックを入れておいた方がいいだろう




16_デジタル署名 ( コードサイニング証明書 )


自作のアプリケーションで [セキュリティの警告] ダイアログ等の発行元を不明にしないようにするには,デジタル署名 (コードサイニング証明書 - 例:日本ベリサイン株式会社) を購入します.現在,マイクロソフトでの証明書発行は行っていません.

アクティベーション回避ツールもあるようですが,筆者はお勧めしません.トラブル発生の原因となる可能性があります.
ある回避ツールについて,Micorsoft では,トラブルの回避策があるとしていますが,本来は回避策ツール側で対応すべき問題と思われます.