★【 My Biz Blog 】★

興味のあるビジネス情報を伝えていきます♪
(IoT,Azure,Windows 10, etc...)

Silverlight for Windows Embedded でアプリを作る - 4 -

2009-12-24 10:00:00 | Windows Embedded関連
前回の記事では、Silverlight for Windows embedded用アプリの

プロジェクト『SLDemoApp』を作成しました。

今回は、前々回作成したGUIを表示するコードを作成します。

簡単なコードの流れは

・Silverlightエンジンの初期化
  ↓
・XAMLデータ元の設定
  ↓
・表示するWindowの設定
  ↓
・XAMLデータを使ってWindowを表示開始

といった感じです。


※説明のために、エラー処理等を省いていますので、
 お気を付けください。


①まずは『SLDemoApp』プロジェクト内にある、
 SLDemoApp.cppファイルを開いてください。
 Silverlight for WEの機能を使うために、
 関連ヘッダをincludeします。


  #include <pwinuser.h>
  #include <XamlRuntime.h>
  #include <xrdelegate.h>
  #include <xrptr.h>


②WinMain関数に、Silverlight for WEを使うためのコードを
 記述していきます。
 まずは、Silverlgiht for WEのエンジンを初期化します。


  XamlRuntimeInitialize();


 
③XAMLデータ元を指定します。
 ここでは、前々回作成したXAMLファイルがデータ元なので、
 SetFile関数を使用して、ファイルを指定します。
 ファイルは、ルートフォルダにある想定です。

  XRXamlSource XamlSource;
  XamlSource.SetFile(TEXT("SLDemoAPPGUI.xaml"));




④XAMLで作成したGUIを表示する際の
 Windowのパラメータを指定します。
 Win32APIでWindowを表示する際にも
 同じようなことをしますよね。


  XRWindowCreateParams WindowsParam;

  // 変数初期化(お忘れなく)
  memset(&WindowsParam,0x00,sizeof(WindowsParam));

  // Window タイトルの設定
  WindowsParam.pTitle = TEXT("Silverligh for WE Demo Application");

  // Window スタイルの設定
  WindowsParam.Style = WS_POPUP;

  // Windowの表示位置指定
  WindowsParam.Left = 0;
  WindowsParam.Top = 0;



⑤上記の③、④での設定を使って、
 XAMLファイルでのGUI表示を開始します。
 ここからは少しだけややこしいです。

 アプリケーションオブジェクト(IXRApplicationのインスタンス)を取得します。
 このオブジェクトは、プロセス毎に一つ生成されるそうです。


  IXRApplicationPtr pAppPtr;
  hRes = GetXRApplicationInstance(&pAppPtr);


 取得したインスタンスから、XAMLファイルデータからWindowを表示したり、
 XAMLの構造を解析する、ホストオブジェクトを生成します。

  IXRVisualHostPtr pHostPtr;

  pAppPtr->CreateHostFromXaml(&XamlSource,&WindowsParam,&pHostPtr);


 そして、Window(ダイアログ)の表示を開始します。
 この関数は同期処理のようですね。
 MFCのDoModal関数のようなものでしょうか。
 uiRetにはWindowを閉じたときの終了コードが入ります。

  UINT uiRet = 0;
  pHostPtr->StartDialog(&uiRet);





実装は以上です。

これだけでXAMLファイルの表示ができます。

といっても、ホントに表示だけで、

このままだと終了処理もないので

強制終了以外にWindowを閉じれないですが(笑)。



早速ビルドすると、

・・・ビルドが失敗しました

2か所ほど追記が必要です。



⑥ビルドして、以下のようなエラーが出る場合


fatal error C1083: Cannot open include file: 'pwinuser.h': No such file or directory


 単純にincludeのパスが通っていないだけだと思います。
 SLDemoAppのプロジェクトフォルダ内にあるSourcesファイルに
 以下の記述を追加してみてください。


INCLUDES= $(_WINCEROOT)publiccommonoakinc;




⑦ビルドして、以下のようなリンクエラーが出る場合
 

error LNK2019: unresolved external symbol GetXRApplicationInstance referenced in function WinMain


 参照するライブラリファイルが足りていません。
 SLDemoAppのプロジェクトフォルダ内にあるSourcesファイルの
 項目[TARGETLIBS]に、
  ・xamlruntime.lib
  ・uuid.lib
 を追記してみてください。
 

TARGETLIBS=
・・・・・・
$(_PROJECTROOT)cesysgensdklib$(_CPUINDPATH)xamlruntime.lib ¥
$(_PROJECTROOT)cesysgensdklib$(_CPUINDPATH)uuid.lib




 以上でビルドが通るかと思います。

 次回は、作成したアプリをデバイスエミュレータ上で
 動作させてみようと思います。