1
0
mirror of synced 2024-12-25 22:14:51 +01:00
ImHex/main/gui/source/init/run/cli.cpp

77 lines
2.4 KiB
C++

#include "messaging.hpp"
#include <hex/subcommands/subcommands.hpp>
#include <hex/api/plugin_manager.hpp>
#include <hex/helpers/fs.hpp>
#include <hex/helpers/logger.hpp>
#include <wolv/utils/guards.hpp>
#if defined(OS_WINDOWS)
#include <windows.h>
#include <shellapi.h>
#include <codecvt>
#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<std::string> 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<std::codecvt_utf8_utf16<wchar_t>>().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
PluginManager::loadLibraries();
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();
}
}