我想使用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))
答案 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))
不需要破坏。