From 726d0892c81387d2eaaf9a5c3d8d52a74c7a5be9 Mon Sep 17 00:00:00 2001 From: hkr04 Date: Mon, 24 Mar 2025 04:17:01 +0800 Subject: [PATCH] fix bugs in passing env variables --- src/mcp_stdio_client.cpp | 42 +++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/mcp_stdio_client.cpp b/src/mcp_stdio_client.cpp index 7dde0d8..cc4c73c 100644 --- a/src/mcp_stdio_client.cpp +++ b/src/mcp_stdio_client.cpp @@ -204,6 +204,19 @@ bool stdio_client::start_server_process() { } LOG_INFO("Starting server process: ", command_); + + auto convert_to_string = [](const json& value) -> std::string { + if (value.is_string()) { + return value.get(); + } else if (value.is_number_integer()) { + return std::to_string(value.get()); + } else if (value.is_number_float()) { + return std::to_string(value.get()); + } else if (value.is_boolean()) { + return value.get() ? "true" : "false"; + } + throw std::runtime_error("Unsupported type"); + }; #if defined(_WIN32) || defined(_WIN64) // Windows实现 @@ -262,26 +275,11 @@ bool stdio_client::start_server_process() { // 准备环境变量 std::string env_block; if (!env_vars_.empty()) { - char* system_env = GetEnvironmentStringsA(); - if (system_env) { - // 复制系统环境变量 - const char* env_ptr = system_env; - while (*env_ptr) { - std::string env_var(env_ptr); - env_block += env_var + '\0'; - env_ptr += env_var.size() + 1; - } - FreeEnvironmentStringsA(system_env); - - // 添加自定义环境变量 - for (auto it = env_vars_.begin(); it != env_vars_.end(); ++it) { - std::string env_var = it.key() + "=" + it.value().get(); - env_block += env_var + '\0'; - } - - // 添加结束符 - env_block += '\0'; + for (const auto& [key, value] : env_vars_.items()) { + std::string env_var = key + "=" + convert_to_string(value); + env_block += env_var + '\0'; } + env_block += '\0'; } // 创建子进程 @@ -359,10 +357,10 @@ bool stdio_client::start_server_process() { // 设置环境变量 if (!env_vars_.empty()) { - for (auto it = env_vars_.begin(); it != env_vars_.end(); ++it) { - std::string env_var = it.key() + "=" + it.value().get(); + for (const auto& [key, value] : env_vars_.items()) { + std::string env_var = key + "=" + convert_to_string(value); if (putenv(const_cast(env_var.c_str())) != 0) { - LOG_ERROR("Failed to set environment variable: ", it.key()); + LOG_ERROR("Failed to set environment variable: ", key); } } }