2

我想使用接受第二个参数作为“LPTSTR”的 Win API CreateProcess

但是我在 char 数组中有指向我的 exe 的路径。我的 VS2013 项目(静态库)是 Unicode 编码类型。下面的代码片段。在这一行

“appPath = (LPTSTR)TestEXEPath;”

在下面发生类型转换的代码片段中,我看到“appPath”中的字符被转换为一些垃圾字符,而这个表达式“TestEXEPath”的 RHS 确实有有效字符。但是这里没有编译错误。在运行时,这些字符在“appPath”中被破坏。

我知道这种类型转换正在造成这个问题。但是我该如何解决这个问题,如何将这个 char 数组类型转换为“CreateProcess() API 所需的 LPTSTR typr。

或者有没有更好的方法来避免 char 数组本身。

LPTSTR  appPath;
char cwd[_MAX_PATH];
getcwd(cwd, _MAX_PATH);
char TestEXEPath[_MAX_PATH];
strcpy(TestEXEPath, cwd);

strcat(TestEXEPath, "\\pwrtest.exe /sleep /c:1");

appPath = (LPTSTR)TestEXEPath; // The characters in this gets converted to some junk characters.
.......................
......................

CreateProcess(NULL, appPath, NULL, NULL, FALSE, 0, NULL, workingDir, &sI, &pI))
4

3 回答 3

4

您正在为 Unicode 编译,因此LPTSTR扩展为wchar_t*. 但是你有 ANSI 数据,char*. 在这种情况下,调用CreateProcessA和传递 ANSI 数据是最简单的。

BOOL retval = CreateProcessA(..., TestExePath, ...));

如果你想避免使用 ANSI 函数,那么你可以坚持使用wchar_t数组。

whar_t exepath[MAX_PATH + 100]; // enough room for cwd and the rest of command line
GetCurrentDirectory(MAX_PATH, exepath);
wcscat(exepath, L"\\pwrtest.exe /sleep /c:1");
BOOL retval = CreateProcess(..., exepath, ...);

请注意,我从 切换getcwdGetCurrentDirectory以获得工作目录的宽字符版本。

另请注意,您的代码应检查错误。由于懒惰,我在这里忽略了这样做。但是在你的真实代码中,你不应该像我一样偷懒。


您必须施放的事实应该已经为您发出警告信号。好吧,从问题来看,它可能确实如此。当你写:

appPath = (LPTSTR)TestEXEPath;

这只是告诉编译器将TestEXEPath其视为LPTSTR是否真的存在。没有强制转换程序就无法编译的事实告诉你TestEXEPath不是LPTSTR. 演员表并没有改变这个现实,它只是关闭了编译器。总是一个糟糕的举动。

于 2014-08-13T13:04:34.187 回答
2

使用 unicode,LPTSTR 指向一个数组,wchar_t而不是char.
这里有一些额外的解释。

尝试:

TCHAR TestExePath[_MAX_PATH];

并 在. wcscat()_wcscpy()<cwchar>

于 2014-08-13T13:05:18.787 回答
2

还可以在这里查看非常方便的 ATL 转换类:http: //msdn.microsoft.com/en-us/library/87zae4a3.aspx

LPTSTR str = CA2T(TestEXEPath);

或者更简单

CreateProcess(NULL, CA2T(TestEXEPath), NULL, NULL, FALSE, 0, NULL, workingDir, &sI, &pI))

不需要破坏。

于 2014-08-13T13:32:21.913 回答