2

更新プロセス中にプログラムでフォント パッケージを展開したいと考えています。したがって、古いフォント ファイルを\Windows\FontsZIP アーカイブから抽出した新しいフォント ファイルに置き換える必要があります。既存のフォント ファイルを削除するとIOException、別のプロセスがファイルにアクセスするため、エラーが発生します。

RemoveFontResourceを呼び出してWM_FONTCHANGEメッセージで変更を伝達することでフォントを解放しようとしましたが、うまくいきませんでした。ネイティブ エラー 2 (ファイルが見つかりませんか?) と HRESULT -2147467259 が返されますRemoveFontResourcefalseファイルは実際に存在します。

サンプルコード:

[DllImport("coredll.dll", SetLastError = true)]
private static extern int RemoveFontResource(string lpName);

[DllImport("coredll.dll", SetLastError = true)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

private const int WM_FONTCHANGE = 0x001D;
private const int HWND_BROADCAST = 0xffff;

public const string SAMPLE_FILE = @"\Windows\Fonts\MyFont.ttf";

public void RemoveFont()
{
  if (!RemoveFontResource(SAMPLE_FILE)) 
  {
    throw new Win32Exception(Marshal.GetLastWin32Error());
  }

  SendMessage(new IntPtr(HWND_BROADCAST), WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero);

  File.Delete(SAMPLE_FILE);
}

システム全体でフォントを展開して置き換えるクリーンな方法は実際にありますか?

4

1 に答える 1

2

フォント ファイルが OS イメージの一部である場合は、eXecute-In-Place (XIP) 属性が設定されており (読み取り専用、システム、ROM)、単純に置き換えることはできません。同じ名前のファイルを一番上にコピーすることはできますが、元のファイルが隠されます。上にコピーしたファイルを削除すると、元のファイルに戻ります。これは、すべての XIP ファイルに当てはまります。

SysCache ディレクトリを使用してファイルを置き換えることをお勧めします。これは、XIP、ドライバー、DLL、使用中、または置換のためにロックされているかどうかに関係なく、すべてのファイル置換で機能します。

元のファイルと同じ名前のファイルを syscache ディレクトリに配置すると、元のファイルの代わりにこれらのファイルが使用されます。ただし、syscache ディレクトリにファイルを配置した後、デバイスをウォームブートする必要があります。Windows CE/Mobile は、OS の起動時にのみ syscache ファイルを認識して「使用」します。

syscache dir の場所は、OS のバージョンと OEM の決定によって異なる場合があります。WM 6 デバイスでは、\Windows\System\syscache である必要があります。デバイスのファイル システムを調べて、既存の syscache ディレクトリを確認します。

ところで: フォント ファイルは \Windows\Fonts に配置する必要はありません。\Windows に配置しても問題ありません。

于 2013-07-04T03:57:12.270 に答える