int __cdecl wmain(const int argc, const wchar_t* argv[]) { auto programPath = _wcsdup(argv[0]); auto extension = wcsrchr(programPath, '.') + 1; if (wcscmp(extension, L"exe") != 0) { ::wprintf(W("This executable needs to have 'exe' extension")); return -1; } extension[0] = 'd'; extension[1] = 'l'; extension[2] = 'l'; // Parse the options from the command line bool verbose = false; bool waitForDebugger = false; bool helpRequested = false; int newArgc = argc - 1; const wchar_t **newArgv = argv + 1; auto stringsEqual = [](const wchar_t * const a, const wchar_t * const b) -> bool { return ::_wcsicmp(a, b) == 0; }; auto tryParseOption = [&](const wchar_t* arg) -> bool { if ( stringsEqual(arg, W("/_v")) || stringsEqual(arg, W("-_v")) ) { verbose = true; return true; } else if ( stringsEqual(arg, W("/_d")) || stringsEqual(arg, W("-_d")) ) { waitForDebugger = true; return true; } else if ( stringsEqual(arg, W("/_h")) || stringsEqual(arg, W("-_h")) ) { helpRequested = true; return true; } else { return false; } }; while (newArgc > 0 && tryParseOption(newArgv[0])) { newArgc--; newArgv++; } if (helpRequested) { showHelp(); return -1; } else { Logger log; if (verbose) { log.Enable(); } else { log.Disable(); } DWORD exitCode; auto success = TryRun(newArgc, newArgv, log, verbose, waitForDebugger, exitCode, programPath); log << W("Execution ") << (success ? W("succeeded") : W("failed")) << Logger::endl; return exitCode; } }