我需要创建一个要在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的汇编语言,但从那以后几乎没有编码。
答案 0 :(得分:7)
你必须做两件事:
const char*
转换为const TCHAR*
,其中TCHAR
可以是char
或wchar_t
,具体取决于您的项目是否启用了Unicode。const
,因为CreateProcess
需要TCHAR*
,而不是const TCHAR*
。您不能只使用const_cast
,而是需要一个可写缓冲区,并将其传递给CreateProcess
。为此,您可以使用来自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:string
,MultiByteToWideChar()
等使用运行时转换。
或者,您可以改为使用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测试