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な画面からデスクトップ画面に戻り、こんなエラーメッセージが表示されてしまいました。
なお、このメッセージボックスのOKを押すと、プログラムは強制的にブレークポイントによりVisual Studio上で止まった状態となりました。
おいたしちゃだめ、ということのようです。
スポンサード リンク |