如何将字符串转换为LPTSTR

时间:2017-12-14 23:17:46

标签: c++ string createprocess lptstr

我需要创建一个要在CreateProcess中使用的变量:

CreateProcess(z7Cmdline, z7Arg, NULL, NULL, FALSE, NULL, NULL, NULL, &startInfo, &processInfo);

变量z7Arg是7 -zip的参数列表,其中包含基于当前日期的文件名,即:2017-12-13.zip。

string buArg = "-o""c:\\moshe"" a " + buDir + buFileName + "c:\\moshe\\*.pdf";

我想将buArg复制到z7Arg作为LPTSTR以在CreateProcess例程中使用

我该如何解决?

我是C ++编码的新手,30年前我在IBM Fortran& S编程中编程。 Grumman Aerospace的汇编语言,但从那以后几乎没有编码。

3 个答案:

答案 0 :(得分:7)

你必须做两件事:

  1. const char*转换为const TCHAR*,其中TCHAR可以是charwchar_t,具体取决于您的项目是否启用了Unicode。
  2. 删除const,因为CreateProcess需要TCHAR*,而不是const TCHAR*。您不能只使用const_cast,而是需要一个可写缓冲区,并将其传递给CreateProcess
  3. 为此,您可以使用来自ATL或MFC的方便的字符串转换宏。使用它如下:

    CA2T param(buArg.c_str());
    CreateProcess(..., param, ...);
    

    或只是

    CreateProcess(..., CA2T(buArg.c_str()), ...);
    

    详细了解字符串转换宏here

    如果您无法访问项目中的ATL或MFC并且启用了Unicode,则需要使用{{1}手动将char*转换为wchar_t* }。

答案 1 :(得分:2)

在编译Unicode时,基于#include <stdio.h> #include <string.h> int signIn(char username[30], char pass[30]){ FILE *p; char user2[30], pass2[30]; p = fopen("users.txt", "r+"); fscanf(p,"%s\n%s",user2,pass2); if( (strcmp(username,user2)==0) && (strcmp(pass,pass2)==0) ) printf("\nUser and password correct!!!"); else printf("\nUser or password incorrect!\n\n"); printf("\n\n"); fclose(p); return 0; } int signUp(char username[30], char pass[30], char fullName[30]) { FILE *p; p = fopen("users.txt", "r+"); printf("Username: "); scanf("%s", &username); printf("Password: "); scanf("%s", &pass); printf("Full name: "); scanf("%s", &fullName); fprintf(p, "%s\n%s\n%s", username, fullName, pass); fclose(p); return 0; } int main(){ char username[30], pass[30], fullName[30]; int choose; printf("Welcome to student login system!\n"); printf(" 1: Sign in\n 2: Sign up\n"); printf("--------------------------------\n"); scanf("%d", &choose); if(choose==1) { printf("\nUser:"); scanf("%s",username); printf("\nPassword:"); scanf("%s",pass); signIn(username, pass); } if(choose==2) { signUp(username, pass, fullName); } } 的API映射到基于TCHAR的函数,而在编译ANSI / MCBS时,它们会映射到基于wchar_t的函数。

因此,在您的情况下,基于char的{​​{1}}宏映射到TCHAR获取CreateProcess()字符串,或CreateProcessA()获取char* CreateProcessW() } strings。

wchar_t*仅对std::string进行操作,char仅对std::wstring进行操作。

因此,对您的问题最简单的解决方案是直接调用wchar_t,例如:

CreateProcessA()

如果您想致电std::string z7Cmdline = ...; std::string z7Arg = ...; STARTUPINFOA si = {}; ... CreateProcessA(z7Cmdline.c_str(), & z7Arg[0], ..., &si, ...); ,请改为使用CreateProcessW()

std::wstring

在后一种情况下,如果您的输入必须是std::wstring z7Cmdline = ; std::wstring z7Arg = ...; STARTUPINFOW si = {}; ... CreateProcessW(z7Cmdline.c_str(), & z7Arg[0], ..., &si, ...); ,那么您必须通过std:stringMultiByteToWideChar()等使用运行时转换。

或者,您可以改为使用std::wstring_convert

std::basic_string<TCHAR>

答案 2 :(得分:0)

string buArg = "-o""c:\\moshe"" a " + buDir + buFileName + "c:\\moshe\\*.pdf";
LPTSTR lpt = new TCHAR[31];
lpt = (LPTSTR) buArg.c_str();

通过MinGW 6.3.0测试