#include #include "messaging.hpp" #include #include #include #include #include #include #include #if defined(OS_WINDOWS) #include #include #endif namespace hex::init { /** * @brief Handles commands passed to ImHex via the command line * @param argc Argument count * @param argv Argument values */ void runCommandLine(int argc, char **argv) { // Suspend logging while processing command line arguments so // we don't spam the console with log messages while printing // CLI tool messages log::suspendLogging(); ON_SCOPE_EXIT { log::resumeLogging(); }; std::vector args; #if defined (OS_WINDOWS) std::ignore = argv; // On Windows, argv contains UTF-16 encoded strings, so we need to convert them to UTF-8 auto convertedCommandLine = ::CommandLineToArgvW(::GetCommandLineW(), &argc); if (convertedCommandLine == nullptr) { log::error("Failed to get command line arguments"); std::exit(EXIT_FAILURE); } // Skip the first argument (the executable path) and convert the rest to a vector of UTF-8 strings for (int i = 1; i < argc; i += 1) { std::wstring wcharArg = convertedCommandLine[i]; auto utf8Arg = wolv::util::wstringToUtf8(wcharArg); if (!utf8Arg.has_value()) { log::error("Failed to convert command line arguments to UTF-8"); std::exit(EXIT_FAILURE); } args.push_back(*utf8Arg); } ::LocalFree(convertedCommandLine); #else // Skip the first argument (the executable path) and convert the rest to a vector of strings args = { argv + 1, argv + argc }; #endif // Load all plugins but don't initialize them PluginManager::loadLibraries(); for (const auto &dir : paths::Plugins.read()) { PluginManager::load(dir); } // Process the arguments hex::subcommands::processArguments(args); // Explicitly don't unload plugins again here. // Certain CLI commands configure things inside of plugins and then let ImHex start up normally // If plugins were to be unloaded here, this setup would be reset. // PluginManager::load() will be executed again later on, but it will not load any more plugins into the // address space. But they will be properly initialized at that point. } }