summaryrefslogtreecommitdiffstats
path: root/src/entrypoint/qtentrypoint_win.cpp
blob: 3d02c47c8ae12fc048b45e7901a03697be8fec98 (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
// Copyright (C) 2019 The Qt Company Ltd.// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause#include <stdlib.h>// __argc, __argv#include <qt_windows.h>#include <shellapi.h>/* This file contains the code in the QtEntryPoint library for Windows. QtEntryPoint contains the Windows startup code and is required for linking to the Qt DLL. When a Windows application starts, the WinMain function is invoked.*/#if defined(QT_NEEDS_QMAIN)intqMain(int,char**);#define main qMain#elseextern"C"intmain(int,char**);#endif/* WinMain() - Initializes Windows and calls user's startup function main(). NOTE: WinMain() won't be called if the application was linked as a "console" application.*/// Convert a wchar_t to char string, equivalent to QString::toLocal8Bit()// when passed CP_ACP.staticinlinechar*wideToMulti(unsigned int codePage,const wchar_t*aw){const int required =WideCharToMultiByte(codePage,0, aw, -1,nullptr,0,nullptr,nullptr);char*result =newchar[required];WideCharToMultiByte(codePage,0, aw, -1, result, required,nullptr,nullptr);return result;}staticinlineintqtEntryPoint(){int argc = __argc;char**argv = __argv;if(argv)returnmain(argc, argv);wchar_t**argvW =CommandLineToArgvW(GetCommandLineW(), &argc);if(argvW ==nullptr)return-1; argv =newchar*[argc +1];for(int i =0; i != argc; ++i) argv[i] =wideToMulti(CP_ACP, argvW[i]); argv[argc] =nullptr;LocalFree(argvW);const int exitCode =main(argc, argv);for(int i =0; (i != argc) && (argv[i] !=nullptr); ++i)delete[] argv[i];delete[] argv;return exitCode;}extern"C"int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR,int){returnqtEntryPoint();}extern"C"int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR,int){returnqtEntryPoint();}
close