带有std :: string的CreateProcess

时间:2017-07-10 22:55:03

标签: c++

我正在尝试使用std :: string创建CreateProcess,我几乎到处搜索了解如何将std :: string转换为LPSTR

我是C ++的新手

我正在创建一个GUI,当我单击一个按钮时,我想根据我输入的路径以及我输入的32位或64位复选框启动一个程序。

对于客户端目录,我将System :: String ^更改为std :: string

std::string path = this->getClientDirectory(); // Get the directory that the user has set

// Get the EXE bit that the user has ticked.
std::string exe;
if (this->isClient32Ticked)
    exe = "client_x32.exe";
else
    exe = "client_x64.exe";

//add the exe name to the end of the string.
path.append("\\");
path.append(exe);

CreateProcess(NULL, path, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

2 个答案:

答案 0 :(得分:1)

LPSTR代表Long Pointer STRing。它相当于char []或char *。

可以使用c_str()方法从std :: string获取char缓冲区。但那个缓冲区将是const。

这里你必须做的是分配一个char的非const缓冲区并将std :: string const-char缓冲区复制到其中。

char* path = new char[exe.size() + 1] = {'\0'};   //Create the non-const char buffer initialized with zero characters
strncpy(path, exe.c_str(), exe.size());           //Copy the content from exe to path
CreateProcess(NULL, path, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
delete path[];

我也看到了一些可能会在你的帖子中引发问题的内容:

您提到将System :: String ^转换为std :: string的事实。有时这会起作用,有时却不行。原因是.NET存储字符串与STL相比的方式。我不会详细了解为什么在这里,因为这不是你的问题。将托管字符串传递给本机字符串时,应始终首先使用以下命令对其进行编组:

System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(System::String^)

将字符串从本机传递到托管时,您不需要做任何特殊的事情。

答案 1 :(得分:0)

您需要将c_str方法与CreateProcessA ...

一起使用
CreateProcessA(NULL, path.c_str(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

或者使path成为std::wstring并将dataCreateProcess(或CreateProcessW)一起使用,并生活在{{1}的足够远的未来有一个非std::basic_string::data版本(这应该发生在C ++ 17上,但是MSVC尚未赶上它)。

const

W版本的CreateProcess可以就地修改命令参数,这意味着您不应该传递它的“只读”版本。奇怪的是,A版本没有。