Archive for 2014/08

IE 7 での日本語表示と AC3 フォント圧縮

2012/07/13 に書いたエントリ(「WEC 7 の Meiryo フォント」)で、「Meiryo フォントを OS イメージに組み込む場合は、カタログ項目の “Monotype Imaging AC3 Font Compression” を選択しては、いけません。」と書きました。この Monotype Imaging AC3 Font Compression は、Meiryo フォントを組み込まない場合にも注意が必要なケースのあることが分かりました。それは、IE 7 を組み込む場合です。

Monotype Imaging AC3 Font Compression を組み込んだ OS イメージで IE 7 を動かすと、日本語ページを表示する際に、IE 7 内部で例外送出が繰り返し発生し、表示までに長い時間を要したり、あるいは、日本語テキストが表示されない場合もある、という問題があるのです。この問題は、少なくとも ARMv5 と ARMv7 のプロセッサでは発生することを確認しています。僕自身は確認していませんが、x86 では発生しないようです。

IE 7 で日本語ページを表示する際、Monotype Imaging AC3 Font Compression を組み込んだ OS イメージでは、次のようなログが繰り返し出力されます:


  48706 PID:5d80026 TID:5de002e Exception 'Raised Exception' (0xe06d7363): Thread-Id=05de002e(pth=c04a20c0), Proc-Id=05d80026(pprc=c049c8b8) 'iesample.exe', VM-active=05d80026(pprc=c049c8b8) 'iesample.exe'
  48706 PID:5d80026 TID:5de002e PC=400512c8(coredll.dll+0x000412c8) RA=800956f0(kernel.dll+0x0000e6f0) SP=00148ad0, BVA=00148b0c

IE 7 で日本語ページを表示する際に、繰り返し例外送出が起きて表示に時間を要する、という問題は、以前にも経験していたのですが、その時は、原因が分からず、対策をとっていませんでした。先日、この問題に取り組む必要が生じ、あらためて追ってみたところ、ようやく、AC3 フォント圧縮(Monotype Imaging AC3 Font Compression)との因果関係が分かったのです。この問題に以前遭遇した際に、カーネルデバッガで追ってみた時の記憶では、上記の例外送出は、IE 7 内部で、フォントの表示幅を算出する処理で起きているようです。

以前に調べた時の記憶が正しければ、フォントの表示幅を算出する処理で例外送出が起きていますので、フォントデータへのアクセスで例外送出が起きている可能性があります。このことと、ARM プロセッサでは症状が発生し、x86 プロセッサでは症状が発生しないようだ、ということを考え合わせると、フォントデータへのアクセスで word alignment のとれていないデータ読み出しを行っている箇所があり、そこで例外送出が起きる、ということなのかも知れません。全くの憶測にすぎませんが、AC3 フォント圧縮されたフォントファイル(非圧縮の .ttc ではなく、圧縮版の .ac3)内のデータをアクセスする際に、圧縮によって word alignment のとれていないフィールドがあり、そこに対して整数値の読み出しを行おうとして例外送出が起きている、ということなのかも知れません。

なお、このような症状は、WinCE 6.0 では発生していませんでした。従って、WinCE 6.0 から WEC 7 への変更点の中に、要因があるのではないかと思われます。WinCE 6.0 から WEC 7 への変更点の中に、ARM コンパイラの強化があります。WinCE 6.0 までは、ARMv4 アーキテクチャの命令しか出力できなかったのが、WEC 7 では、ARMv5, ARMv6, ARMv7 をサポートしています(※最新メジャー版の WEC 2013 では、ARM コンパイラが再び変更され、ARMv7 のみのサポートとなったのは、皆さんご存知の通りです)。WEC 7 での ARM コンパイラの強化には、この他に、memcpy() や memset() が Intrinsic Function となった、というものがあります。これは、ARM コンパイラだけではなく、x86, ARM, MIPS 共通です。

memcpy() や memset() が Intrisic Function となった結果、これらの関数に渡す実引数の型次第では、byte 単位ではなく、word 単位でのアクセスが行われるようです。これは、一般的には高速化に役立ちますが、[unsigned ]short や [unsigned ]long、[unsigned ]int のポインタが実引数として渡され、かつ、実際には、そのポインタ値が、word alignment がとれていない場合(つまり、short のポインタ値が 2Byte 単位のアドレス境界に揃っていなかったり、long のポインタ値が 4Byte 単位のアドレス境界に揃っていない場合)、ARM プロセッサでは、例外送出が起きてしまいます。x86 では、例外送出は起きません。このような状況は、たとえば、可変長のヘッダを持つ通信パケットがあり、そのペイロードを構造体にキャストしてアクセスする場合に起こり得ます。もしかすると、IE 7 が AC3 フォント圧縮されたフォントファイル内のデータをアクセスする際に、そのようなことが起きているの *かも* 知れません。

WinCE 6.0 から WEC 7 への変更点には、コンパイラの強化の他に、IE の変更もあり、レンダリングエンジンの強化も行われていますから、コンパイラの違いが要因ではなく、レンダリングエンジンの変更が要因である可能性もあります。IE 7 のレンダリングエンジンのソースコードは開示されていませんので、真相は、Microsoft で調べてもらわなければ分かりません。

ともあれ、少なくとも現時点では、Meiryo フォントに加え、IE 7 とも、Monotype Imaging AC3 Font Compression を共存させてはいけない、ということが言えます。IE 7 と日本語フォントを OS イメージに組み込まれる方は、ご留意下さい。

■おまけ
WEC 7 のコンパイラの Intrinsic Function のうち、CPU アーキテクチャ共通のものについては、リファレンスの次のセクションに記載されています:

 Compiler Intrinsic Functions (Compact 7)
 http://msdn.microsoft.com/en-us/library/ee480143(v=winembedded.70).aspx

memcpy() や memset() は、次のページに載っています:

 Intrinsic Forms of CRT Functions (Compact 7)
 http://msdn.microsoft.com/en-us/library/ee479418(v=winembedded.70).aspx

Add comment 2014/08/25 koga

OS Design から生成した SDK インストーラの問題(日本語ロケール)

■はじめに
Windows Embedded Compact (WEC) では、OS のコンフィグレーション、つまり OS Design に対応した SDK を作成できることは、皆さんご存知の通りです。もし、OS Design に対応した SDK を作成する方法をご存知ないのであれば、開発者ガイドの次のページが参考になります:

 Create an SDK (Compact 7)
 http://msdn.microsoft.com/en-us/library/jj200346(v=winembedded.70).aspx

 Build an SDK (Compact 2013)
 http://msdn.microsoft.com/en-us/library/dn197930.aspx

OS Design に対応した SDK を使ってアプリケーションを作成することにより、アプリケーションと OS のコンフィグレーションの食い違いが起きるのを防ぐことができる、というわけです。たとえば、DirectShow を組み込んでいない OS で動かすアプリケーションを作成する際に、誤って DirectShow API を呼び出すコードを書いてしまうという手違いが、なくなります。そのようなコードを書いても、OS に組み込まれていない API を宣言したヘッダファイルやライブラリは、SDK には組み込まれていないので、アプリケーションをビルドする際にビルドエラーとなるからです。

ところで、WEC 7 の開発環境では、この SDK に少しだけ問題があります。作成した SDK のインストーラで、画面表示が不適切になってしまう箇所があるのです。下の図を見て下さい。

  OEM EULA Dialog

この図は、SDK のインストーラの、使用許諾契約書 (EULA; End-User License Agreement) の表示・同意確認画面ですが、「同意しない」 (Decline) のラジオボタンが途中で切れてしまい、見えていません(※「同意」までしか見えていません)。これは、ユーザに不親切で、適切ではありません。SDK をビルドする際、日本語ロケールに設定せず、英語ロケールにした場合には、”Accept” と “Decline” という二つのラジオボタンが正しく表示されるのですが、日本語ロケールだと、上の図のように、表示が途中で切れてしまうのです。

これは、どちらかといえば、WEC 7 の開発ツールの不具合ですが、少なくとも2014年8月までにリリースされたアップデータでは、修正されていません。しかし、ご安心下さい。この不具合は、自分で修正することができます。

■SDK インストーラのテンプレート
上で紹介した開発者ガイドのページで説明されているように、SDK を作成してビルドすると、SDK のインストーラ(.msi ファイル)が生成されるのですが、この .msi ファイルは、ビルドのたびに一から生成されるのではなく、テンプレートを元にして生成されます。このテンプレートは、WEC 7/Visual Studio 2008 の場合ですと、次のディレクトリに配置されています:

 C:/Program Files (x86)/Microsoft Platform Builder/7.00/cepb/ideVS/SdkTools/RollerFiles

注:上のディレクトリパスは、64bit OS の場合です。32bit OS では、’Program Files’ の後の ‘(x86)’ は、ありません。

上のディレクトリには、.msi ファイルのテンプレートの他、使用許諾契約書のテンプレートや、SDK のビルド時に実行される VB スクリプト(.vbs ファイル)も収録されています。興味のある方は、それらの内容をご覧になってみて下さい。

さて、今回重要なのは、.msi ファイルのテンプレートです。日本語ロケール用のテンプレートファイルは、拡張子の前に ‘_1041′ が付いており、
 template_1041.msi
というのが、日本語ロケール用のものです。このテンプレートには、SDK のダイアログのリソースも入っており、それを修正することで、上述した画面表示の問題を解消できます。では、.msi ファイルの内容を、どうやって修正すればよいのでしょうか?

ご安心下さい。Visual Studio には、.msi ファイルの内容を編集できる orca というツールが付属しています。このツールを使えば、.msi ファイルを開いて、インストーラのダイアログのリソースを編集できるのです。

■インストーラのテンプレートを修正する
orca を使うには、まずインストールしなければいけません。Visual Studio や WEC の開発環境(Platform Builder)をインストールしただけでは、orca はインストールされないのです。orca のインストーラが付属しているので、それを使ってインストールして下さい。orca のインストーラは、C:/Program Files (x86)/ ディレクトリ(※32bit OS の場合は、C:/Program Files/ ディレクトリ)で、’orca’ を含む名前のファイルを検索すれば見つけることができます。VS 2008 + WEC 7 をインストールしていれば、
 C:/Program Files (x86)/Windows Kits/8.0/bin/x86/
というディレクトリの中に、Orca-x86_en-us.msi というファイルが見つかるでしょう。もし、この他に、
 C:/Program Files (x86)/Orca/
というディレクトリと、その中に入っている Orca.exe というファイルが見つかる場合には、既に orca がインストールされています。orca がインストールされていない場合は、見つかったインストーラを実行して、インストールして下さい。

orca をインストールして使えるようになったら、いよいよ、日本語ロケールの SDK のインストーラのテンプレート(.msi ファイル)を開いて修正です。おっと、その前に、修正する .msi ファイルのバックアップをとっておいて下さい。万が一、修正作業で手違いが起きても、元の状態に戻せるようにするためです。

orca の使い方については、次のページが参考になるでしょう:

 Orca データベース エディタを使用して Windows インストーラ ファイルを編集する方法
 http://support.microsoft.com/kb/255905/ja

問題の、使用許諾契約書の表示・同意確認画面のラジオボタンの表示設定は、’Control’ テーブルに入っています。下に、’Control’ テーブルの該当行を編集しようとしている様子を写した画面キャプチャを示します。

 orca edit window

上の図の、選択されて青くハイライトされているのが、Control テーブルの該当行です。この行は、’OEM_EULA_Dlg’ というダイアログの、Control カラムの値が ‘Buttons’、Type カラムの値が ‘RadioButtonGroup’ という行です。この行の ‘Width’ というカラムに、二つのラジオボタンで構成されたラジオボタングループの表示幅が格納されています。日本語ロケールの SDK インストーラで表示が切れてしまうのは、この幅が、英語表示だと足りるものの、日本語表示だと足りない値だからなのです。従って、この幅の値を増やしてやれば、表示が切れなくなります。上の画面キャプチャで、黄色くハイライトされているカラムは、値が 135 ですが、これを 170 に変更すると、「同意しない」というキャプションが、正しく表示されるようになります。

.msi ファイルの編集中に、編集結果を確認したい場合には、orca の ‘Tools’ メニューから ‘Dialog Preview…’ を選択すれば、ダイアログ表示をプレビューできます。試してみて下さい。

Add comment 2014/08/22 koga

WEC 7 の WMP サンプルアプリケーション

■Microsoft Silverlight for Windows Embedded の修正にまつわる問題と対処
WEC 7 で、付属のメディアプレイヤーアプリケーション(Music Player, Photo Viewer, Video Player)を組み込んだ OS イメージをビルドしていらっしゃる方は、月例アップデータを適用する場合、注意する必要があります。今年リリースされた月例アップデータの中に、適用すると、これらメディアプレイヤーアプリケーションが動作しなくなる症状を引き起こすものがあるからです。

具体的に言うと、Microsoft Silverlight for Windows Embedded に対する修正が多く投入された Monthly Update May 2014 において、その問題を確認しています。これは、不具合というよりは、月例アップデータのパッケージング上の問題だと思います。Monthly Update May 2014 には、以下の8件の修正が投入されているのですが、この中に、問題の要因があるようです:

 Windows Embedded Compact 7 Monthly Update May 2014
 http://www.microsoft.com/en-us/download/details.aspx?id=43368

  FIX: Cannot display all UI elements correctly in a SWE application for Windows Embedded Compact 7
  
FIX: Storyboard doesn’t run if it references a custom DependencyProperty in Windows Embedded Compact 7
  FIX: Poor performance when you use XAMLRuntime OpenGL in Windows Embedded Compact 7
  FIX: Cannot receive the GID_END gesture message in an SWE application on a Windows Embedded Compact 7-based device
  FIX: An update is available about adding the GetTemplateChild method to the SWE IXRControl class in Windows Embedded Compact 7
  FIX: Setting DataContext to null resets two-way binding in the SWE application in Windows Embedded Compact 7
  FIX: ListBox selection issue when you use touch gestures in an SWE application on a Windows Embedded Compact 7-based device
  FIX: A RadioButton in a ListBox control stays in checked state when removed and re-added in Windows Embedded Compact 7

このアップデータを適用する前に、メディアプレイヤーアプリケーションを組み込んだ OS イメージをビルドしたことがある場合、このアップデータを適用してから OS イメージをビルドすると、その OS 上でメディアプレイヤーアプリケーションを起動しようとすると、起動時にアプリケーション内部で例外送出が起き、起動しないのです。この症状は、OS イメージをビルドする際、Platform Builder のソリューションエクスプローラで以下のフォルダ配下をリビルドすることで解決できます:

 C:/WINCE700/
  public/
   mediaapps/
    oak/
     samples/
★     cemp

‘cemp’ ディレクトリ配下に、メディアプレイヤーアプリケーションのソースコードがあります。アップデータを適用後、このディレクトリ配下をリビルドしてから OS イメージをビルドする(※OSDesign をリビルドする)ことにより、メディアアプリケーションが起動しないという問題が解消します。

この問題の原因は不明ですが、アップデータに含まれる Silverlight for Windows Embedded (SWE) の修正において、バイナリ互換性を壊してしまったものがあり、そのため、アプリケーションをリビルドしなければならない、ということのようです。

■問題の発生要因
さて、このような問題は、通常起きませんし、起きてはならないことだと思います。WEC 7 に付属しているコンポーネントが、アップデータの適用によって動作しなくなるということは、通常は考えられない事態です。実際、僕は初めて体験しました。特殊な状況だと思います。

この問題ですが、冒頭の方で、「不具合というよりは、月例アップデータのパッケージング上の問題だと思います。」と述べました。どういうことかといえば、ビルド済みの中間バイナリファイルが要因なのです。メディアプレイヤーアプリケーションと同様、WEC 7 に付属するアプリケーションである標準シェル(explorer.exe)や IE 7 は、メディアプレイヤーと同様、アプリケーション部分はソースファイルが付属するのですが、ビルド済みの中間バイナリファイル(.lib)も付属しており、手作業で明示的にソースファイルをビルドしない限りは、ビルド済みの中間バイナリファイルをリンクしてアプリケーションの .exe が生成されます。仮に、それらのアプリケーションとのバイナリ互換性を壊す修正が OS 本体に加えられた場合は、アプリケーションのビルド済み中間バイナリファイルも、修正と一緒に配布されるでしょう。従って、メディアプレイヤーアプリケーションで起きたような問題は、発生しないのです。

一方、メディアプレイヤーアプリケーションは、ソースファイルしか付属していないため、バイナリ互換性を壊す修正が OS 本体に加えられても、それに対応したビルド済み中間バイナリファイルはアップデータに含まれません。OS イメージをビルドする際、メディアプレイヤーアプリケーションのソースが未だビルドされていない場合は、ビルドされて、ビルド済み中間バイナリファイルが、ソースファイルのディレクトリ内に生成されます。OS イメージをビルドする際に、メディアプレイヤーアプリケーションのソースファイルから生成されたビルド済み中間バイナリファイルは、ソースファイルが更新されるか、または、手作業で明示的にソースファイルをリビルドしなければ更新されません。これが、上述した問題の原因、というわけなのです。

今回紹介した、Silverlight for Windows Embedded アプリケーションが月例アップデータ適用後に動作しなくなる、という問題は、僕は初めて体験しました。特殊なケースだとは思いますが、月例アップデータ、および、メディアプレイヤーアプリケーション(WMP サンプルアプリケーション)の WEC 7 における提供のされ方に要因があり、今後も起こる可能性がある問題だと思います。月例アップデータを適用する際には、適用前に、どのような修正が加えられたのかを確認し、Silverlight for Windows Embedded に関する修正の場合は、注意される方が良いと思います。

Add comment 2014/08/05 koga


Categories

Links

Posts by Authors

Recent Posts

Calendar

2014年8月
« 2月   9月 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

Posts by Month

Posts by Category

Meta