// Pure console application that completely bypasses WinUI3 #include "pch.h" // Minimal includes - NO WinUI3 dependencies #include #include #include "../src/Common/VideoTypes.h" #include "../src/Decoder/VideoDecoderFactory.h" #include "../src/FileIO/WebMFileReader.h" #include "HeadlessDecoder.h" using namespace Vav2Player; // Forward declare WinUI3 entry point extern "C" int APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int); // Our custom main that intercepts before WinUI3 int APIENTRY wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { // Parse command line early int argc = 0; LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc); if (argc >= 2) { // Headless mode - run pure console version LocalFree(argv); // Set console mode AllocConsole(); FILE* pCout; FILE* pCerr; FILE* pCin; freopen_s(&pCout, "CONOUT$", "w", stdout); freopen_s(&pCerr, "CONOUT$", "w", stderr); freopen_s(&pCin, "CONIN$", "r", stdin); // Convert args and run main std::vector args; for (int i = 0; i < argc; i++) { int size = WideCharToMultiByte(CP_UTF8, 0, argv[i], -1, NULL, 0, NULL, NULL); std::string arg(size - 1, 0); WideCharToMultiByte(CP_UTF8, 0, argv[i], -1, &arg[0], size, NULL, NULL); args.push_back(arg); } // Convert to char* array std::vector argv_char; for (auto& arg : args) { argv_char.push_back(&arg[0]); } return main(argc, argv_char.data()); } else { // UI mode - hand off to WinUI3 (we can't easily do this without conflicts) LocalFree(argv); // This would require calling the original WinUI3 entry point // For now, we'll implement a message MessageBoxA(NULL, "UI mode should be launched separately", "Vav2Player", MB_OK); return 0; } } int main(int argc, char* argv[]) { // Pure console mode - no WinUI3 at all if (argc < 2) { std::cout << "Usage: Vav2PlayerHeadless.exe " << std::endl; return 1; } // Setup console SetConsoleCP(CP_UTF8); SetConsoleOutputCP(CP_UTF8); std::cout << "[PURE_HEADLESS] Starting without WinUI3 libraries" << std::endl; // Convert argument std::string input_file = argv[1]; // Run decoder directly bool success = false; try { HeadlessDecoder decoder; success = decoder.ProcessFile(input_file); } catch (const std::exception& e) { std::cerr << "Exception: " << e.what() << std::endl; } catch (...) { std::cerr << "Unknown exception" << std::endl; } return success ? 0 : 1; }