diff --git a/atom/app/atom_main.cc b/atom/app/atom_main.cc index 2da9319dfbbc..02dc985e30c4 100644 --- a/atom/app/atom_main.cc +++ b/atom/app/atom_main.cc @@ -155,7 +155,7 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) { content::ContentMainParams params(&delegate); params.instance = instance; params.sandbox_info = &sandbox_info; - atom::AtomCommandLine::Init(argc, const_cast(argv)); + atom::AtomCommandLine::Init(argc, argv); return content::ContentMain(params); } diff --git a/atom/app/atom_main_args.cc b/atom/app/atom_main_args.cc index 00039f0346a4..fb04ce5e735c 100644 --- a/atom/app/atom_main_args.cc +++ b/atom/app/atom_main_args.cc @@ -6,15 +6,13 @@ namespace atom { -// static -std::vector AtomCommandLine::argv_; - -// static -void AtomCommandLine::Init(int argc, const char* argv[]) { - argv_.reserve(argc); - for (int i = 0; i < argc; ++i) { - argv_.push_back(argv[i]); + void AtomCommandLine::Init(int argc, + const char* const* argv) { + for (int i = 0; i < argc; ++i) { + argv_.push_back(argv[i]); + } } -} + + std::vector AtomCommandLine::argv_; } // namespace atom diff --git a/atom/app/atom_main_args.h b/atom/app/atom_main_args.h index 3d6db95f776d..db34b4ed05b5 100644 --- a/atom/app/atom_main_args.h +++ b/atom/app/atom_main_args.h @@ -5,22 +5,22 @@ #ifndef ATOM_APP_ATOM_MAIN_ARGS_H_ #define ATOM_APP_ATOM_MAIN_ARGS_H_ +#include #include #include "base/logging.h" namespace atom { -// Singleton to remember the original "argc" and "argv". class AtomCommandLine { public: - static void Init(int argc, const char* argv[]); - static std::vector argv() { return argv_; } + static void Init(int argc, const char* const* argv); + static std::vector argv() { return argv_; } private: - static std::vector argv_; + static std::vector argv_; - DISALLOW_IMPLICIT_CONSTRUCTORS(AtomCommandLine); + DISALLOW_COPY_AND_ASSIGN(AtomCommandLine); }; } // namespace atom diff --git a/atom/common/node_bindings.cc b/atom/common/node_bindings.cc index ce00c5d38888..2503bb6175b5 100644 --- a/atom/common/node_bindings.cc +++ b/atom/common/node_bindings.cc @@ -18,6 +18,10 @@ #include "native_mate/locker.h" #include "native_mate/dictionary.h" +#if defined(OS_WIN) +#include "base/strings/utf_string_conversions.h" +#endif + #include "atom/common/node_includes.h" using content::BrowserThread; @@ -88,6 +92,18 @@ namespace { void UvNoOp(uv_async_t* handle) { } +// Convert the given vector to an array of C-strings. The strings in the +// returned vector are only guaranteed valid so long as the vector of strings +// is not modified. +scoped_ptr StringVectorToArgArray( + const std::vector& vector) { + scoped_ptr array(new const char*[vector.size()]); + for (size_t i = 0; i < vector.size(); ++i) { + array[i] = vector[i].c_str(); + } + return array.Pass(); +} + base::FilePath GetResourcesPath(base::CommandLine* command_line, bool is_browser) { base::FilePath exec_path(command_line->argv()[0]); @@ -157,9 +173,10 @@ node::Environment* NodeBindings::CreateEnvironment( std::string script_path_str = script_path.AsUTF8Unsafe(); args.insert(args.begin() + 1, script_path_str.c_str()); + scoped_ptr c_argv = StringVectorToArgArray(args); node::Environment* env = node::CreateEnvironment( context->GetIsolate(), uv_default_loop(), context, - args.size(), &args[0], 0, nullptr); + args.size(), c_argv.get(), 0, nullptr); mate::Dictionary process(context->GetIsolate(), env->process_object()); process.Set("type", process_type);