4

我需要创建一个变量来使用CreateProcess

CreateProcess(z7Cmdline, z7Arg, NULL, NULL, FALSE, NULL, NULL, NULL, &startInfo, &processInfo);

变量 z7Arg 是 7 -zip 的参数列表,其中包含基于当前日期的文件名,即:2017-12-13.zip。

string buArg = "-o""c:\\moshe"" a " + buDir + buFileName + "c:\\moshe\\*.pdf";

我想将 buArg 复制到 z7Arg 作为 LPTSTR 以在 CreateProcess 例程中使用

我该怎么做?

我是 C++ 编码的新手,30 年前我为 Grumman Aerospace 使用 IBM Fortran 和汇编语言编程,但从那时起几乎没有编写过代码。

4

3 回答 3

7

你必须做两件事:

  1. 转换const char*const TCHAR*,其中TCHAR可能是charwchar_t取决于是否为您的项目启用了 Unicode。
  2. 删除const是因为CreateProcess需要TCHAR*,而不是const TCHAR*。你不能只使用const_cast,你需要一个可写的缓冲区,你将传递给CreateProcess.

为此,您可以使用来自 ATL 或 MFC 的方便的字符串转换宏。按以下方式使用它:

CA2T param(buArg.c_str());
CreateProcess(..., param, ...);

要不就

CreateProcess(..., CA2T(buArg.c_str()), ...);

在此处阅读有关字符串转换宏的更多信息。

如果您在项目中无权访问 ATL 或 MFC,并且启用了 Unicode,则需要手动转换char*wchar_t*使用MultibyteToWideChar.

于 2017-12-14T23:24:53.877 回答
3

在为 Unicode 编译时,TCHAR基于 - 的 API 映射到wchar_t基于 - 的函数,而在为 ANSI/MCBS 编译时,它们映射到char基于 - 的函数。

因此,在您的情况下,TCHAR基于- 的CreateProcess()宏映射到CreateProcessA()获取char*字符串或CreateProcessW()获取wchar_t*字符串。

std::stringchar使用,并且仅std::wstring使用wchar_t

因此,解决您的问题的最简单方法是CreateProcessA()直接调用,例如:

std::string z7Cmdline = ...;
std::string z7Arg = ...;
STARTUPINFOA si = {};
... 
CreateProcessA(z7Cmdline.c_str(), & z7Arg[0], ..., &si, ...);

如果您想调用CreateProcessW(),请std::wstring改用:

std::wstring z7Cmdline = ;
std::wstring z7Arg = ...;
STARTUPINFOW si = {};
... 
CreateProcessW(z7Cmdline.c_str(), & z7Arg[0], ..., &si, ...);

在后一种情况下,如果您的输入必须是std:string,那么您必须使用运行时转换、 via MultiByteToWideChar()std::wstring_convert等。

或者,您可以std::basic_string<TCHAR>改用:

std::basic_string<TCHAR> z7Cmdline = ;
std::basic_string<TCHAR> z7Arg = ...;
STARTUPINFO si = {};
... 
CreateProcess(z7Cmdline.c_str(), & z7Arg[0], ..., &si, ...);
于 2017-12-15T00:08:36.903 回答
0
string buArg = "-o""c:\\moshe"" a " + buDir + buFileName + "c:\\moshe\\*.pdf";
LPTSTR lpt = new TCHAR[31];
lpt = (LPTSTR) buArg.c_str();

经 MinGW 6.3.0 测试

于 2018-10-22T14:03:16.013 回答