c++ - 在 C++ 中将 char[] 数组转换为 LPCTSTR

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

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

但是我在一个字符数组中有我的 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))

最佳答案

您正在为 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。类型转换并没有改变现实,它只是关闭了编译器。总是一个糟糕的举动。

关于c++ - 在 C++ 中将 char[] 数组转换为 LPCTSTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25286960/

相关文章:

C++ 需要一种很好的技术来播种不使用 time() 的 rand()

javascript - 将字符串转换为大写和小写

python - 按行分块大字符串的最佳方法

visual-studio-2010 - 在调试客户端-服务器应用程序时在解决方案中运行这两个应用程序

C++ 如何从文件创建 byte[] 数组(我不是说逐字节读取文件)?

c++ - libstdc++ GLIBCXX 版本错误

c++ - 如何让std::hash_set<pair<T1, T2>>编译运行

c++ - Windows C++ GUI 应用程序

string - Swift 字符串比较使用哪种规范化?

winapi - 检测在 ListView 内单击并显示上下文菜单