Metro styleアプリと言えども、Windows上で動いているアプリケーションの1つ、ちょっと手を伸ばせば、user32.dllやgdi32.dllがそこに置いてあるわけです。ダメと言われたら試したくなるものです。user32.dllのMessageBoxを呼んでみました。

1
2
3
4
5
6
7
8
#include <windows.h>
 
// 適当に設置したボタンのクリックイベントのハンドラ
typedef int WINAPI MessageBoxWType(HWND, LPCWSTR, LPCWSTR, int);
auto hmodUser = ::LoadLibraryEx(TEXT("user32.dll"), nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
auto messageBoxW = reinterpret_cast<MessageBoxWType*>(::GetProcAddresss(hmodUser, "MessageBoxW"));
messageBoxW(nullptr, L"Hello world", L"Test", 0);
::FreeLibrary(hmodUser);

Metro styleアプリプロジェクトでは、windows.hをインクルードしても一部の許されたWindows APIの宣言しか行われないようになっています(Win32 and COM for Metro style appsに挙がっているのはおそらく使える)。そのため、自前でMessageBoxの型に関するtypedefを行っています。その制限がなければtypedef decltype(::MessageBoxW) MessageBoxWType;とできた(参考:Visual C++ 2010でWin32APIプログラミングは革命を迎える)、いや、そもそもLoadLibraryEx/GetProcAddressする必要もなかったのですが。

これをDebugモードでビルド・実行すると、Metroな画面からデスクトップ画面に戻り、こんなエラーメッセージが表示されてしまいました。

エラーメッセージを伝えるダイアログ(Metro Styleアプリ内でMessageBox関数を呼び出したら表示された)

なお、このメッセージボックスのOKを押すと、プログラムは強制的にブレークポイントによりVisual Studio上で止まった状態となりました。

おいたしちゃだめ、ということのようです。


スポンサード リンク

この記事のカテゴリ

  • ⇒ Metro styleアプリ内でMessageBoxを呼ぶとどうなるか
  • ⇒ Metro styleアプリ内でMessageBoxを呼ぶとどうなるか
  • ⇒ Metro styleアプリ内でMessageBoxを呼ぶとどうなるか