在vc ++中将char []数组转换为LPTSTR

时间:2014-08-13 13:01:16

标签: c++ string visual-c++ casting lptstr

我想使用Win API CreateProcess,它接受​​第二个参数为“LPTSTR”。

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

  

“appPath =(LPTSTR)TestEXEPath;”

下面的代码片段中发生了类型转换的

,我看到“appPath”中的字符转换为一些垃圾字符,而此表达式“TestEXEPath”的RHS确实有有效字符。 但是tehre在这里没有编译错误。在运行时,这个字符在“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))

3 个答案:

答案 0 :(得分: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, ...);

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

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


你必须施放的事实应该为你发出警告信号。那么,从这个问题来看,它可能确实如此。当你写:

appPath = (LPTSTR)TestEXEPath;

这只是告诉编译器将TestEXEPath视为LPTSTR是否确实存在。而且程序在没有演员表的情况下无法编译的事实告诉您TestEXEPath不是LPTSTR。演员表并没有改变这种现实,只是关闭了编译器。总是一个糟糕的举动。

答案 1 :(得分:2)

使用unicode,LPTSTR指向wchar_t的数组,而不是char的数组。
Here一些额外的解释。

尝试:

TCHAR TestExePath[_MAX_PATH];

使用wcscat()wcscpy()以及<cwchar>中的其他宽字符串处理函数。

答案 2 :(得分: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))

不需要破坏。