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

C++ 在vc+中将char[]数组转换为LPTSTR+;,c++,string,visual-c++,casting,lptstr,C++,String,Visual C++,Casting,Lptstr,我想使用WinAPI,它接受第二个参数为“LPTSTR” 但是我有一个字符数组中的exe的路径。我的VS2013项目(静态库)是Unicode编码类型。 下面是代码snippert。 在这一行 “appPath=(LPTSTR)TestEXEPath;” 在下面发生类型转换的代码段中,我看到“appPath”中的字符被转换为一些垃圾字符,而表达式“TestEXEPath”的RHS中确实有有效字符。 然而,这里没有编译错误。在运行时,此字符在“appPath”中被损坏 我知道这个类型转换造成了这个

我想使用WinAPI,它接受第二个参数为“LPTSTR”

但是我有一个字符数组中的exe的路径。我的VS2013项目(静态库)是Unicode编码类型。 下面是代码snippert。 在这一行

“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))

您正在编译Unicode,因此
LPTSTR
扩展为
wchar\u 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
,不管它是否真的是这样。没有cast,程序就无法编译,这一事实告诉你
TestEXEPath
不是
LPTSTR
。cast并没有改变这一事实,它只是关闭了编译器。总是一个糟糕的举动。

h unicode,LPTSTR指向
wchar\u t
的数组,而不是
char
的数组
一些额外的解释

尝试:

TCHAR TestExePath[_MAX_PATH];

使用
wcscat()
wcscpy()
以及

中的其他宽c字符串处理函数,也可以在此处查看非常方便的ATL转换类:

甚至更容易

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

无需销毁。

您可以首先使用
GetCurrentDirectory
将其作为宽字符串获取。您还应该使用
PathCombine
的变体将文件名添加到路径上。感谢这一有用的信息。有没有一种方法可以让我为Unicode和ANSCI(MultiByteCharc)编写可移植的代码?@codeLover您只想在为不支持Unicode的Windows 95/98/ME编码时这样做。我怀疑您是否这样做。在这种情况下,请简化您的生活,并为Windows的本机字符集UTF-16 Unicode编码。这当然是一个很好的建议。只是好奇地想了解,2件事::1)如果VS project设置为“Unicode”如果我使用ANSCII函数,如CreateProcessA、char[]、strcpy、getcwd()等(&I)。。会引起什么问题吗?如果我使用ANSCII函数和数据类型,那么选择Unicode的全部意义是什么。2) 与Unicode相比,在VS项目设置中使用“多字节字符集”(ANSCII)作为设置是否有任何优势。那么,为什么VS提供ANSCII作为默认设置,即使Unicode是windows的本机设置。ANSCII对UNicode是否有任何与内存相关的建议?1)没有问题。如果您完全使用ANSI,那么就不要以Unicode为目标。但您确定不支持国际文本、使用长文件名等。2)根据您希望作为默认字符集的字符集选择MBCS或Unicode。出于历史原因,MBCS是默认设置(至少在较旧的VS版本中)。使用ANSI有更大的内存和性能要求,因为本机API是Unicode,所以Windows API ANSI函数必须在ANSI和Unicode之间转换,因为底层API都是Unicode。我认为在web和MSDN上有很多很好的主题涉及到这些问题。我不确定关于您的原始问题我能提供更多。这正确地回答了我的问题,我需要一个
动态ascii-c字符串
转换为LPTSTR。
CreateProcess(NULL, CA2T(TestEXEPath), NULL, NULL, FALSE, 0, NULL, workingDir, &sI, &pI))