int WINAPI wWinMain(HINSTANCE, HINSTANCE, PWSTR, int nCmdShow) { #ifdef _CRTDBG_MAP_ALLOC _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); #endif // TODO: Place code here. MSG msg = {0}; HACCEL hAccelTable; INITCOMMONCONTROLSEX InitCtrlEx; InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); InitCtrlEx.dwICC = 0x00004000; //ICC_STANDARD_CLASSES; InitCommonControlsEx(&InitCtrlEx); _bstr_t requestedURL; int argc = 0; WCHAR** argv = CommandLineToArgvW(GetCommandLineW(), &argc); for (int i = 1; i < argc; ++i) { if (!wcsicmp(argv[i], L"--transparent")) s_usesLayeredWebView = true; else if (!wcsicmp(argv[i], L"--desktop")) s_fullDesktop = true; else if (!requestedURL) requestedURL = argv[i]; } // Initialize global strings LoadString(hInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInst, IDC_WINLAUNCHER, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInst); if (shouldUseFullDesktop()) computeFullDesktopFrame(); // Init COM OleInitialize(NULL); if (usesLayeredWebView()) { hURLBarWnd = CreateWindow(L"EDIT", L"Type URL Here", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, s_windowPosition.x, s_windowPosition.y + s_windowSize.cy, s_windowSize.cx, URLBAR_HEIGHT, 0, 0, hInst, 0); } else { hMainWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInst, 0); if (!hMainWnd) return FALSE; hBackButtonWnd = CreateWindow(L"BUTTON", L"<", WS_CHILD | WS_VISIBLE | BS_TEXT, 0, 0, 0, 0, hMainWnd, 0, hInst, 0); hForwardButtonWnd = CreateWindow(L"BUTTON", L">", WS_CHILD | WS_VISIBLE | BS_TEXT, CONTROLBUTTON_WIDTH, 0, 0, 0, hMainWnd, 0, hInst, 0); hURLBarWnd = CreateWindow(L"EDIT", 0, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, CONTROLBUTTON_WIDTH * 2, 0, 0, 0, hMainWnd, 0, hInst, 0); ShowWindow(hMainWnd, nCmdShow); UpdateWindow(hMainWnd); } DefEditProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hURLBarWnd, GWLP_WNDPROC)); DefButtonProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hBackButtonWnd, GWLP_WNDPROC)); SetWindowLongPtr(hURLBarWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(EditProc)); SetWindowLongPtr(hBackButtonWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(BackButtonProc)); SetWindowLongPtr(hForwardButtonWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(ForwardButtonProc)); SetFocus(hURLBarWnd); RECT clientRect = { s_windowPosition.x, s_windowPosition.y, s_windowPosition.x + s_windowSize.cx, s_windowPosition.y + s_windowSize.cy }; IWebPreferencesPtr tmpPreferences; if (FAILED(WebKitCreateInstance(CLSID_WebPreferences, 0, IID_IWebPreferences, reinterpret_cast<void**>(&tmpPreferences.GetInterfacePtr())))) goto exit; if (FAILED(tmpPreferences->standardPreferences(&gStandardPreferences.GetInterfacePtr()))) goto exit; if (!setToDefaultPreferences()) goto exit; HRESULT hr = WebKitCreateInstance(CLSID_WebView, 0, IID_IWebView, reinterpret_cast<void**>(&gWebView.GetInterfacePtr())); if (FAILED(hr)) goto exit; hr = gWebView->QueryInterface(IID_IWebViewPrivate, reinterpret_cast<void**>(&gWebViewPrivate.GetInterfacePtr())); if (FAILED(hr)) goto exit; hr = WebKitCreateInstance(CLSID_WebHistory, 0, __uuidof(gWebHistory), reinterpret_cast<void**>(&gWebHistory.GetInterfacePtr())); if (FAILED(hr)) goto exit; gWebHost = new WinLauncherWebHost(); gWebHost->AddRef(); hr = gWebView->setFrameLoadDelegate(gWebHost); if (FAILED(hr)) goto exit; gPrintDelegate = new PrintWebUIDelegate; gPrintDelegate->AddRef(); hr = gWebView->setUIDelegate(gPrintDelegate); if (FAILED (hr)) goto exit; gAccessibilityDelegate = new AccessibilityDelegate; gAccessibilityDelegate->AddRef(); hr = gWebView->setAccessibilityDelegate(gAccessibilityDelegate); if (FAILED (hr)) goto exit; hr = gWebView->setHostWindow(reinterpret_cast<OLE_HANDLE>(hMainWnd)); if (FAILED(hr)) goto exit; hr = gWebView->initWithFrame(clientRect, 0, 0); if (FAILED(hr)) goto exit; if (!requestedURL) { IWebFramePtr frame; hr = gWebView->mainFrame(&frame.GetInterfacePtr()); if (FAILED(hr)) goto exit; frame->loadHTMLString(_bstr_t(defaultHTML).GetBSTR(), 0); } hr = gWebViewPrivate->setTransparent(usesLayeredWebView()); if (FAILED(hr)) goto exit; hr = gWebViewPrivate->setUsesLayeredWindow(usesLayeredWebView()); if (FAILED(hr)) goto exit; hr = gWebViewPrivate->viewWindow(reinterpret_cast<OLE_HANDLE*>(&gViewWindow)); if (FAILED(hr) || !gViewWindow) goto exit; if (usesLayeredWebView()) subclassForLayeredWindow(); resizeSubViews(); ShowWindow(gViewWindow, nCmdShow); UpdateWindow(gViewWindow); hAccelTable = LoadAccelerators(hInst, MAKEINTRESOURCE(IDC_WINLAUNCHER)); if (requestedURL.length()) loadURL(requestedURL.GetBSTR()); #pragma warning(disable:4509) // Main message loop: __try { while (GetMessage(&msg, 0, 0, 0)) { #if USE(CF) CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true); #endif if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } __except(createCrashReport(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) { } exit: gPrintDelegate->Release(); shutDownWebKit(); #ifdef _CRTDBG_MAP_ALLOC _CrtDumpMemoryLeaks(); #endif // Shut down COM. OleUninitialize(); return static_cast<int>(msg.wParam); }
int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpstrCmdLine, _In_ int nCmdShow) { #ifdef _CRTDBG_MAP_ALLOC _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); #endif MSG msg = {0}; HACCEL hAccelTable; INITCOMMONCONTROLSEX InitCtrlEx; InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); InitCtrlEx.dwICC = 0x00004000; // ICC_STANDARD_CLASSES; InitCommonControlsEx(&InitCtrlEx); bool usesLayeredWebView = false; bool useFullDesktop = false; bool pageLoadTesting = false; _bstr_t requestedURL; parseCommandLine(usesLayeredWebView, useFullDesktop, pageLoadTesting, requestedURL); // Initialize global strings LoadString(hInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInst, IDC_WINLAUNCHER, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInst); if (useFullDesktop) computeFullDesktopFrame(); // Init COM OleInitialize(nullptr); float scaleFactor = WebCore::deviceScaleFactorForWindow(nullptr); if (usesLayeredWebView) { hURLBarWnd = CreateWindow(L"EDIT", L"Type URL Here", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, scaleFactor * s_windowPosition.x, scaleFactor * (s_windowPosition.y + s_windowSize.cy), scaleFactor * s_windowSize.cx, scaleFactor * URLBAR_HEIGHT, 0, 0, hInst, 0); } else { hMainWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInst, 0); if (!hMainWnd) return FALSE; hBackButtonWnd = CreateWindow(L"BUTTON", L"<", WS_CHILD | WS_VISIBLE | BS_TEXT, 0, 0, 0, 0, hMainWnd, 0, hInst, 0); hForwardButtonWnd = CreateWindow(L"BUTTON", L">", WS_CHILD | WS_VISIBLE | BS_TEXT, scaleFactor * CONTROLBUTTON_WIDTH, 0, 0, 0, hMainWnd, 0, hInst, 0); hURLBarWnd = CreateWindow(L"EDIT", 0, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, scaleFactor * CONTROLBUTTON_WIDTH * 2, 0, 0, 0, hMainWnd, 0, hInst, 0); ShowWindow(hMainWnd, nCmdShow); UpdateWindow(hMainWnd); } DefEditProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hURLBarWnd, GWLP_WNDPROC)); DefButtonProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(hBackButtonWnd, GWLP_WNDPROC)); SetWindowLongPtr(hURLBarWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(EditProc)); SetWindowLongPtr(hBackButtonWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(BackButtonProc)); SetWindowLongPtr(hForwardButtonWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(ForwardButtonProc)); SetFocus(hURLBarWnd); RECT clientRect; ::GetClientRect(hMainWnd, &clientRect); if (usesLayeredWebView) clientRect = { s_windowPosition.x, s_windowPosition.y, s_windowPosition.x + s_windowSize.cx, s_windowPosition.y + s_windowSize.cy }; WinLauncherWebHost* webHost = nullptr; IWebDownloadDelegatePtr downloadDelegate; downloadDelegate.Attach(new WebDownloadDelegate()); gWinLauncher = new WinLauncher(hMainWnd, hURLBarWnd, usesLayeredWebView, pageLoadTesting); if (!gWinLauncher) goto exit; if (!gWinLauncher->seedInitialDefaultPreferences()) goto exit; if (!gWinLauncher->setToDefaultPreferences()) goto exit; HRESULT hr = gWinLauncher->init(); if (FAILED(hr)) goto exit; if (!setCacheFolder()) goto exit; webHost = new WinLauncherWebHost(gWinLauncher, hURLBarWnd); hr = gWinLauncher->setFrameLoadDelegate(webHost); if (FAILED(hr)) goto exit; hr = gWinLauncher->setFrameLoadDelegatePrivate(webHost); if (FAILED(hr)) goto exit; hr = gWinLauncher->setUIDelegate(new PrintWebUIDelegate()); if (FAILED (hr)) goto exit; hr = gWinLauncher->setAccessibilityDelegate(new AccessibilityDelegate()); if (FAILED (hr)) goto exit; hr = gWinLauncher->setResourceLoadDelegate(new ResourceLoadDelegate(gWinLauncher)); if (FAILED(hr)) goto exit; hr = gWinLauncher->setDownloadDelegate(downloadDelegate); if (FAILED(hr)) goto exit; hr = gWinLauncher->prepareViews(hMainWnd, clientRect, requestedURL.GetBSTR(), gViewWindow); if (FAILED(hr) || !gViewWindow) goto exit; if (gWinLauncher->usesLayeredWebView()) subclassForLayeredWindow(); resizeSubViews(); ShowWindow(gViewWindow, nCmdShow); UpdateWindow(gViewWindow); hAccelTable = LoadAccelerators(hInst, MAKEINTRESOURCE(IDC_WINLAUNCHER)); if (requestedURL.length()) loadURL(requestedURL.GetBSTR()); #pragma warning(disable:4509) // Main message loop: __try { _com_ptr_t<_com_IIID<IWebKitMessageLoop, &__uuidof(IWebKitMessageLoop)>> messageLoop; hr = WebKitCreateInstance(CLSID_WebKitMessageLoop, 0, IID_IWebKitMessageLoop, reinterpret_cast<void**>(&messageLoop.GetInterfacePtr())); if (FAILED(hr)) goto exit; messageLoop->run(hAccelTable); } __except(createCrashReport(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) { } exit: shutDownWebKit(); #ifdef _CRTDBG_MAP_ALLOC _CrtDumpMemoryLeaks(); #endif // Shut down COM. OleUninitialize(); delete gWinLauncher; return static_cast<int>(msg.wParam); }