#include "messaging.hpp" #include #include #include #include #include #if defined(OS_WINDOWS) #include #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) hex::unused(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 convert command line arguments to UTF-8"); 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]; std::string utf8Arg = std::wstring_convert>().to_bytes(wcharArg); 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 for (const auto &dir : fs::getDefaultPaths(fs::ImHexPath::Plugins)) { PluginManager::load(dir); } // Setup messaging system to allow sending commands to the main ImHex instance hex::messaging::setupMessaging(); // Process the arguments hex::subcommands::processArguments(args); // Unload plugins again PluginManager::unload(); } }