【问题标题】:Convert char[] array to LPTSTR in vc++在 vc++ 中将 char[] 数组转换为 LPTSTR
【发布时间】:2014-08-13 13:01:15
【问题描述】:

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

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

"appPath = (LPTSTR)TestEXEPath;"

在发生类型转换的以下代码 sn-p 中,我看到“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))

【问题讨论】:

  • 您可以首先使用GetCurrentDirectory 将其作为宽字符串获取。您还应该使用PathCombine 的变体将文件名添加到路径中。

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


【解决方案1】:

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

【讨论】:

  • 感谢您提供此有用信息。有没有一种方法可以让我为 Unicode 和 ANSCI (MultiByteCharc) 编写可移植的代码?
  • @codeLover 如果您正在为不支持 Unicode 的 Windows 95/98/ME 编码,您只想这样做。我怀疑你是。在这种情况下,让您的生活变得简单,并为 Windows 的本机字符集 UTF-16 Unicode 编码。
  • 当然好的建议。只是好奇,2 件事 :: 1)如果 VS 项目设置设置为“Unicode”并且如果我使用 ANSCII 函数,如 CreateProcessA、char[]、strcpy、getcwd() 等。它会导致任何问题吗?如果我使用 ANSCII 函数和数据类型,那么选择 Unicode 的重点是什么。 2)将“多字节字符集”(ANSCII)作为VS项目设置中的设置而不是Unicode有什么好处。那么为什么即使 Unicode 是 Windows 原生的,VS 也提供 ANSCII 作为默认设置。与 UNIcode 相比,ANSCII 是否有任何与内存相关的优势?
  • 1) 没有问题。如果您完全使用 ANSI,则不要以 Unicode 为目标。但是您确定您不想支持国际文本、使用长文件名等吗? 2) 根据您希望使用的默认字符集选择 MBCS 或 Unicode。由于历史原因,MBCS 是默认设置(至少在旧 VS 版本中)。使用 ANSI 对内存和性能要求更高,因为原生 API 是 Unicode,因此 Windows API ANSI 函数必须在 ANSI 和 Unicode 之间转换,因为底层 API 都是 Unicode。
  • 我认为 Web 和 MSDN 上有很多很好的主题可以涵盖这些问题。对于您的原始问题,我不确定我还能提供更多信息。
【解决方案2】:

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

尝试:

TCHAR TestExePath[_MAX_PATH];

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

【讨论】:

    【解决方案3】:

    还可以在这里查看非常方便的 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))
    

    不需要销毁。

    【讨论】:

    • 这正确回答了我的问题,我需要将 dynamic ascii-c-string 转换为 LPTSTR 。
    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 2011-06-08
    • 2013-06-06
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    相关资源
    最近更新 更多