Chromium Code Reviews| Index: win8/metro_driver/metro_driver_win7.cc |
| diff --git a/win8/metro_driver/metro_driver_win7.cc b/win8/metro_driver/metro_driver_win7.cc |
| index 253e527b8c2a29dd0e26da8e8a0c3f9543e2bbe2..512321b1854875e30a7b8f91d1859a9a66b383df 100644 |
| --- a/win8/metro_driver/metro_driver_win7.cc |
| +++ b/win8/metro_driver/metro_driver_win7.cc |
| @@ -3,41 +3,11 @@ |
| // found in the LICENSE file. |
| #include "stdafx.h" |
| +#include <corewindow.h> |
| -EXTERN_C IMAGE_DOS_HEADER __ImageBase; |
| +#include "base/logging.h" |
| -struct Globals { |
| - LPTHREAD_START_ROUTINE host_main; |
| - void* host_context; |
| - HWND core_window; |
| - HWND host_window; |
| - HANDLE host_thread; |
| - DWORD main_thread_id; |
| -} globals; |
| - |
| - |
| -void ODS(const char* str, LONG_PTR val = 0) { |
| - char buf[80]; |
| - size_t len = strlen(str); |
| - if (len > 50) { |
| - ::OutputDebugStringA("ODS: buffer too long"); |
| - return; |
| - } |
| - |
| - if (str[0] == '!') { |
| - // Fatal error. |
| - DWORD gle = ::GetLastError(); |
| - if (::IsDebuggerPresent()) |
| - __debugbreak(); |
| - wsprintfA(buf, "ODS:fatal %s (%p) gle=0x%x", str, val, gle); |
| - ::MessageBoxA(NULL, buf, "!!!", MB_OK); |
| - ::ExitProcess(gle); |
| - } else { |
| - // Just information. |
| - wsprintfA(buf, "ODS:%s (%p)\n", str, val); |
| - ::OutputDebugStringA(buf); |
| - } |
| -} |
| +EXTERN_C IMAGE_DOS_HEADER __ImageBase; |
| LRESULT CALLBACK WndProc(HWND hwnd, UINT message, |
| WPARAM wparam, LPARAM lparam) { |
| @@ -50,7 +20,6 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, |
| break; |
| case WM_DESTROY: |
| PostQuitMessage(0); |
| - ODS("Metro WM_DESTROY received"); |
| break; |
| default: |
| return DefWindowProc(hwnd, message, wparam, lparam); |
| @@ -62,78 +31,526 @@ HWND CreateMetroTopLevelWindow() { |
| HINSTANCE hInst = reinterpret_cast<HINSTANCE>(&__ImageBase); |
| WNDCLASSEXW wcex; |
| wcex.cbSize = sizeof(wcex); |
| - wcex.style = CS_HREDRAW | CS_VREDRAW; |
| - wcex.lpfnWndProc = WndProc; |
| - wcex.cbClsExtra = 0; |
| - wcex.cbWndExtra = 0; |
| - wcex.hInstance = hInst; |
| - wcex.hIcon = 0; |
| - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); |
| - wcex.hbrBackground = (HBRUSH)(COLOR_INACTIVECAPTION+1); |
| - wcex.lpszMenuName = 0; |
| - wcex.lpszClassName = L"Windows.UI.Core.CoreWindow"; |
| - wcex.hIconSm = 0; |
| + wcex.style = CS_HREDRAW | CS_VREDRAW; |
| + wcex.lpfnWndProc = WndProc; |
| + wcex.cbClsExtra = 0; |
| + wcex.cbWndExtra = 0; |
| + wcex.hInstance = hInst; |
| + wcex.hIcon = 0; |
| + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); |
| + wcex.hbrBackground = (HBRUSH)(COLOR_INACTIVECAPTION+1); |
| + wcex.lpszMenuName = 0; |
| + wcex.lpszClassName = L"Windows.UI.Core.CoreWindow"; |
| + wcex.hIconSm = 0; |
| HWND hwnd = ::CreateWindowExW(0, |
| MAKEINTATOM(::RegisterClassExW(&wcex)), |
| - L"metro_metro", |
| + L"metro_win7", |
| WS_POPUP, |
| 0, 0, 0, 0, |
| NULL, NULL, hInst, NULL); |
| return hwnd; |
| } |
| -DWORD WINAPI HostThread(void*) { |
| - // The sleeps simulates the delay we have in the actual metro code |
| - // which takes in account the corewindow being created and some other |
| - // unknown machinations of metro. |
| - ODS("Chrome main thread", ::GetCurrentThreadId()); |
| - ::Sleep(30); |
| - return globals.host_main(globals.host_context); |
| -} |
| +typedef winfoundtn::ITypedEventHandler< |
| + winapp::Core::CoreApplicationView*, |
| + winapp::Activation::IActivatedEventArgs*> ActivatedHandler; |
| -extern "C" __declspec(dllexport) |
| -int InitMetro(LPTHREAD_START_ROUTINE thread_proc, void* context) { |
| - ODS("InitMetro [Win7 emulation]"); |
| - HWND window = CreateMetroTopLevelWindow(); |
| - if (!window) |
| - return 1; |
| - // This magic incatation tells windows that the window is going fullscreen |
| - // so the taskbar gets out of the wait automatically. |
| - ::SetWindowPos(window, |
| - HWND_TOP, |
| - 0,0, |
| - GetSystemMetrics(SM_CXSCREEN), |
| - GetSystemMetrics(SM_CYSCREEN), |
| - SWP_SHOWWINDOW); |
| - |
| - // Ready to start our caller. |
| - globals.core_window = window; |
| - globals.host_main = thread_proc; |
| - globals.host_context = context; |
| - HANDLE thread = ::CreateThread(NULL, 0, &HostThread, NULL, 0, NULL); |
| - |
| - // Main message loop. |
| - MSG msg = {0}; |
| - while (GetMessage(&msg, NULL, 0, 0)) { |
| - TranslateMessage(&msg); |
| - DispatchMessage(&msg); |
| - } |
| - |
| - return (int) msg.wParam; |
| -} |
| +typedef winfoundtn::ITypedEventHandler< |
| + winui::Core::CoreWindow*, |
| + winui::Core::WindowActivatedEventArgs*> WindowActivatedHandler; |
| -extern "C" _declspec(dllexport) HWND GetRootWindow() { |
| - ODS("GetRootWindow", ULONG_PTR(globals.core_window)); |
| - return globals.core_window; |
| -} |
| +typedef winfoundtn::ITypedEventHandler< |
| + winui::Core::CoreWindow*, |
| + winui::Core::AutomationProviderRequestedEventArgs*> |
| + AutomationProviderHandler; |
| + |
| +typedef winfoundtn::ITypedEventHandler< |
| + winui::Core::CoreWindow*, |
| + winui::Core::CharacterReceivedEventArgs*> CharEventHandler; |
| + |
| +typedef winfoundtn::ITypedEventHandler< |
| + winui::Core::CoreWindow*, |
| + winui::Core::CoreWindowEventArgs*> CoreWindowEventHandler; |
| + |
| +typedef winfoundtn::ITypedEventHandler< |
| + winui::Core::CoreWindow*, |
| + winui::Core::InputEnabledEventArgs*> InputEnabledEventHandler; |
| + |
| +typedef winfoundtn::ITypedEventHandler< |
| + winui::Core::CoreWindow*, |
| + winui::Core::KeyEventArgs*> KeyEventHandler; |
| + |
| +typedef winfoundtn::ITypedEventHandler< |
| + winui::Core::CoreWindow*, |
| + winui::Core::PointerEventArgs*> PointerEventHandler; |
| + |
| +typedef winfoundtn::ITypedEventHandler< |
| + winui::Core::CoreWindow*, |
| + winui::Core::WindowSizeChangedEventArgs*> SizeChangedHandler; |
| + |
| +typedef winfoundtn::ITypedEventHandler< |
| + winui::Core::CoreWindow*, |
| + winui::Core::TouchHitTestingEventArgs*> TouchHitTestHandler; |
| + |
| +typedef winfoundtn::ITypedEventHandler< |
| + winui::Core::CoreWindow*, |
| + winui::Core::VisibilityChangedEventArgs*> VisibilityChangedHandler; |
| + |
| +// The following classes are the emulation of the WinRT system as exposed |
| +// to metro applications. There is one application (ICoreApplication) which |
| +// contains a series of Views (ICoreApplicationView) each one of them |
| +// containing a CoreWindow which represents a surface that can drawnt to |
|
zturner
2014/03/20 18:14:14
s/drawnt/drawn/
cpu_(ooo_6.6-7.5)
2014/03/20 22:13:13
Done.
zturner
2014/03/20 22:29:24
On a second look, it should actually say "that can
|
| +// and that receives events. |
| +// |
| +// Here is the general dependency hierachy in terms of interfaces: |
| +// |
| +// IFrameworkViewSource --> IFrameworkView |
| +// ^ | |
| +// | | metro app |
| +// --------------------------------------------------------------------- |
| +// | | winRT system |
| +// | v |
| +// ICoreApplication ICoreApplicationView |
| +// | |
| +// v |
| +// ICoreWindow ----> ICoreWindowInterop |
| +// | |
| +// | |
| +// V |
| +// real HWND |
| +// |
| + |
| +class CoreWindowEmulation |
| + : public mswr::RuntimeClass< |
| + mswr::RuntimeClassFlags<mswr::WinRtClassicComMix>, |
| + winui::Core::ICoreWindow, ICoreWindowInterop> { |
| + public: |
| + // ICoreWindow implementation: |
| + virtual HRESULT STDMETHODCALLTYPE get_AutomationHostProvider( |
| + IInspectable **value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_Bounds( |
| + winfoundtn::Rect* value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_CustomProperties( |
| + winfoundtn::Collections::IPropertySet **value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_Dispatcher( |
| + winui::Core::ICoreDispatcher **value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_FlowDirection( |
| + winui::Core::CoreWindowFlowDirection* value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE put_FlowDirection( |
| + winui::Core::CoreWindowFlowDirection value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_IsInputEnabled( |
| + boolean* value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE put_IsInputEnabled( |
| + boolean value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_PointerCursor( |
| + winui::Core::ICoreCursor **value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE put_PointerCursor( |
| + winui::Core::ICoreCursor* value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_PointerPosition( |
| + winfoundtn::Point* value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_Visible( |
| + boolean* value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE Activate(void) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE Close(void) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE GetAsyncKeyState( |
| + ABI::Windows::System::VirtualKey virtualKey, |
| + winui::Core::CoreVirtualKeyStates* KeyState) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE GetKeyState( |
| + ABI::Windows::System::VirtualKey virtualKey, |
| + winui::Core::CoreVirtualKeyStates* KeyState) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE ReleasePointerCapture(void) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE SetPointerCapture(void) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_Activated( |
| + WindowActivatedHandler* handler, |
| + EventRegistrationToken* pCookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_Activated( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_AutomationProviderRequested( |
| + AutomationProviderHandler* handler, |
| + EventRegistrationToken* cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_AutomationProviderRequested( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_CharacterReceived( |
| + CharEventHandler* handler, |
| + EventRegistrationToken* pCookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_CharacterReceived( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_Closed( |
| + CoreWindowEventHandler* handler, |
| + EventRegistrationToken* pCookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_Closed( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_InputEnabled( |
| + InputEnabledEventHandler* handler, |
| + EventRegistrationToken* pCookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_InputEnabled( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_KeyDown( |
| + KeyEventHandler* handler, |
| + EventRegistrationToken* pCookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_KeyDown( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_KeyUp( |
| + KeyEventHandler* handler, |
| + EventRegistrationToken* pCookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_KeyUp( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_PointerCaptureLost( |
| + PointerEventHandler* handler, |
| + EventRegistrationToken* cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_PointerCaptureLost( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_PointerEntered( |
| + PointerEventHandler* handler, |
| + EventRegistrationToken* cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_PointerEntered( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_PointerExited( |
| + PointerEventHandler* handler, |
| + EventRegistrationToken* cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_PointerExited( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_PointerMoved( |
| + PointerEventHandler* handler, |
| + EventRegistrationToken* cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_PointerMoved( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_PointerPressed( |
| + PointerEventHandler* handler, |
| + EventRegistrationToken* cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_PointerPressed( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_PointerReleased( |
| + PointerEventHandler* handler, |
| + EventRegistrationToken* cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_PointerReleased( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_TouchHitTesting( |
| + TouchHitTestHandler* handler, |
| + EventRegistrationToken* pCookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_TouchHitTesting( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_PointerWheelChanged( |
| + PointerEventHandler* handler, |
| + EventRegistrationToken* cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_PointerWheelChanged( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_SizeChanged( |
| + SizeChangedHandler* handler, |
| + EventRegistrationToken* pCookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_SizeChanged( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_VisibilityChanged( |
| + VisibilityChangedHandler* handler, |
| + EventRegistrationToken* pCookie) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_VisibilityChanged( |
| + EventRegistrationToken cookie) { |
| + return S_OK; |
| + } |
| + |
| + // ICoreWindowInterop implementation: |
| + virtual HRESULT STDMETHODCALLTYPE get_WindowHandle( |
| + HWND *hwnd) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE put_MessageHandled( |
| + boolean value) { |
| + return S_OK; |
| + } |
| + |
| +}; |
| + |
| +class CoreApplicationViewEmulation |
| + : public mswr::RuntimeClass<winapp::Core::ICoreApplicationView> { |
| + public: |
| + CoreApplicationViewEmulation() { |
| + core_window_ = mswr::Make<CoreWindowEmulation>(); |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_CoreWindow( |
| + winui::Core::ICoreWindow **value) { |
| + if (!core_window_) |
| + return E_FAIL; |
| + *value = core_window_.Get(); |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_Activated( |
| + ActivatedHandler* handler, |
| + EventRegistrationToken* token) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_Activated( |
| + EventRegistrationToken token) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_IsMain( |
| + boolean* value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_IsHosted( |
| + boolean* value) { |
| + return S_OK; |
| + } |
| + |
| + private: |
| + mswr::ComPtr<winui::Core::ICoreWindow> core_window_; |
| +}; |
| + |
| +// Hey I'm just fakeMetro, |
| +// And this is crazy, |
| +// But here's my ICoreApplication, |
| +// So call me, maybe! |
|
cpu_(ooo_6.6-7.5)
2014/03/20 17:50:32
I'll remove the silly comment.
cpu_(ooo_6.6-7.5)
2014/03/20 22:13:13
Done.
|
| +class CoreApplicationWin7Emulation |
| + : public mswr::RuntimeClass<winapp::Core::ICoreApplication, |
| + winapp::Core::ICoreApplicationExit> { |
| + public: |
| + // ICoreApplication implementation: |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_Id( |
|
zturner
2014/03/20 18:14:14
Don't these (and other similar) methods need to se
cpu_(ooo_6.6-7.5)
2014/03/20 22:13:13
Correct, I am trying to reduce the size of the CL.
|
| + HSTRING* value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_Suspending( |
| + winfoundtn::IEventHandler<winapp::SuspendingEventArgs*>* handler, |
| + EventRegistrationToken* token) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_Suspending( |
| + EventRegistrationToken token) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_Resuming( |
| + winfoundtn::IEventHandler<IInspectable*>* handler, |
| + EventRegistrationToken* token) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_Resuming( |
| + EventRegistrationToken token) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE get_Properties( |
| + winfoundtn::Collections::IPropertySet** value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE GetCurrentView( |
| + winapp::Core::ICoreApplicationView** value) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE Run( |
|
cpu_(ooo_6.6-7.5)
2014/03/20 17:50:32
Here is the only meat in this new set of classes.
|
| + winapp::Core::IFrameworkViewSource* viewSource) { |
| + HRESULT hr = viewSource->CreateView(app_view_.GetAddressOf()); |
| + if (FAILED(hr)) |
| + return hr; |
| + view_emulation_ = mswr::Make<CoreApplicationViewEmulation>(); |
| + hr = app_view_->Initialize(view_emulation_.Get()); |
| + if (FAILED(hr)) |
| + return hr; |
| + mswr::ComPtr<winui::Core::ICoreWindow> core_window; |
| + hr = view_emulation_->get_CoreWindow(core_window.GetAddressOf()); |
| + if (FAILED(hr)) |
| + return hr; |
| + hr = app_view_->SetWindow(core_window.Get()); |
| + return hr; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE RunWithActivationFactories( |
| + winfoundtn::IGetActivationFactory* activationFactoryCallback) { |
| + return S_OK; |
| + } |
| + |
| + // ICoreApplicationExit implementation: |
| + |
| + virtual HRESULT STDMETHODCALLTYPE Exit(void) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE add_Exiting( |
| + winfoundtn::IEventHandler<IInspectable*>* handler, |
| + EventRegistrationToken* token) { |
| + return S_OK; |
| + } |
| + |
| + virtual HRESULT STDMETHODCALLTYPE remove_Exiting( |
| + EventRegistrationToken token) { |
| + return S_OK; |
| + } |
| + |
| + private: |
| + mswr::ComPtr<winapp::Core::IFrameworkView> app_view_; |
| + mswr::ComPtr<winapp::Core::ICoreApplicationView> view_emulation_; |
| +}; |
| -extern "C" _declspec(dllexport) void SetFrameWindow(HWND window) { |
| - ODS("SetFrameWindow", ULONG_PTR(window)); |
| - globals.host_window = window; |
| -} |
| -extern "C" __declspec(dllexport) const wchar_t* GetInitialUrl() { |
| - return L""; |
| +mswr::ComPtr<winapp::Core::ICoreApplication> InitWindows7() { |
| + HRESULT hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); |
|
zturner
2014/03/20 18:14:14
Where do we call CoUninitialize()?
cpu_(ooo_6.6-7.5)
2014/03/20 22:13:13
We don't. I normally never call that. It only brin
|
| + if (FAILED(hr)) |
| + CHECK(false); |
| + return mswr::Make<CoreApplicationWin7Emulation>(); |
| } |