Winapi 如何使用系统调用在我的Win32 Visual C++应用程序中压缩文件夹 我试图用系统调用在我的Win32 Visual C++应用程序中压缩文件夹。在我的计算机上,我可以通过cmd命令执行此操作: PowerShell -Command "Compress-Archive -Path C:\Users\ttyler\Desktop\Software\Folder2\RUN -DestinationPath C:\Users\ttyler\Desktop\Software\Folder2\RUN"

Winapi 如何使用系统调用在我的Win32 Visual C++应用程序中压缩文件夹 我试图用系统调用在我的Win32 Visual C++应用程序中压缩文件夹。在我的计算机上,我可以通过cmd命令执行此操作: PowerShell -Command "Compress-Archive -Path C:\Users\ttyler\Desktop\Software\Folder2\RUN -DestinationPath C:\Users\ttyler\Desktop\Software\Folder2\RUN",winapi,visual-c++,zip,system,call,Winapi,Visual C++,Zip,System,Call,其中Try是一个文件夹 我试图使用系统调用在我的应用程序上执行此操作,但在我的应用程序中,我将路径和DestinationPath存储在变量中,因为用户正在拉入目标路径。我不确定在系统调用中是否正确使用了变量,因为这给了我一个错误:“+”:无法添加两个指针,并且表达式必须具有整数或非范围枚举类型 TCHAR path = L"C:\Users\ttyler\Desktop\Software\Folder2\RUN"; TCHAR DestinationPath = L&quo

其中Try是一个文件夹

我试图使用系统调用在我的应用程序上执行此操作,但在我的应用程序中,我将路径和DestinationPath存储在变量中,因为用户正在拉入目标路径。我不确定在系统调用中是否正确使用了变量,因为这给了我一个错误:“+”:无法添加两个指针,并且表达式必须具有整数或非范围枚举类型

TCHAR path = L"C:\Users\ttyler\Desktop\Software\Folder2\RUN";
TCHAR DestinationPath = L"C:\Users\ttyler\Desktop\Software\Folder2\RUN.zip";
system("Compress-Archive -Path" + path[0] + "-DestinationPath" + DestinationPath[0]);

在系统调用中使用变量时,我做错了什么?

您的代码无法工作,原因有很多:

您正在尝试将宽字符串文字分配给单字符变量。您需要使用数组或指针,例如: TCHAR path[]=LC:\\Users\\ttyler\\Desktop\\Software\\Folder2\\RUN; TCHAR DestinationPath[]=LC:\\Users\\ttyler\\Desktop\\Software\\Folder2\\RUN.zip; LPCTSTR path=LC:\\Users\\ttyler\\Desktop\\Software\\Folder2\\RUN; LPCTSTR DestinationPath=LC:\\Users\\ttyler\\Desktop\\Software\\Folder2\\RUN.zip; 不能按您尝试的方式将字符串文字与数组/单个字符连接起来。您必须分配新数组,并将不同的子字符串复制/格式化到其中,例如: WCHAR path[]=LC:\\Users\\ttyler\\Desktop\\Software\\Folder2\\RUN; WCHAR DestinationPath[]=LC:\\Users\\ttyler\\Desktop\\Software\\Folder2\\RUN.zip; WCHAR cmd[MAX_PATH*2+50]={}; swprintfcmd,LCompress存档-路径\%s \-DestinationPath\%s\,路径,DestinationPath; //根据需要使用cmd。。。 或者,只需使用std::wstring即可,例如:

std::wstring path=LC:\\Users\\ttyler\\Desktop\\Software\\Folder2\\RUN; std::wstring DestinationPath=LC:\\Users\\ttyler\\Desktop\\Software\\Folder2\\RUN.zip; std::wstring cmd=LCompress Archive-Path\+Path+L \-DestinationPath\+DestinationPath+L\; //根据需要使用cmd。。。 系统采用常量字符*指针作为输入。但是您使用的是TCHAR字符串,只有当TCHAR是WCHAR时,它才能正确地用于宽字符串文本。这意味着您无论如何都不能将连接的字符串传递给系统。您将不得不改用W系统,例如: _wsystemcmd;//使用WCHAR[]/LPWSTR时 _wsystemcmd.c_str;//使用std::wstring时 system/_wsystem运行cmd.exe/C的实例,其中是指定的输入字符串。但它有自己的应用程序,有自己的命令行参数。PowerShell.exe命令不是有效的cmd.exe命令,即您正在尝试执行以下命令: cmd.exe/C压缩存档-路径-目标路径 这不是有效的命令,因为cmd.exe不知道压缩存档是什么。您需要执行以下操作:

cmd.exe/C PowerShell-命令压缩存档-路径\\-DestinationPath\\ WCHAR cmd[MAX_PATH*2+70]={}; swprintfcmd,LPowerShell-Command\Compress Archive-Path\\\\%s\\\\\-DestinationPath\\\%s\\\,Path,DestinationPath; std::wstring cmd=LPowerShell-Command\Compress Archive-Path\\\\+Path+L\\\\-DestinationPath\\\+DestinationPath+L\\\; 但是,您确实应该改用直接运行PowerShell.exe,完全不要使用cmd.exe,例如:

STARTUPINFO si={sizeofSTARTUPINFO,0}; 进程信息pi={}; 如果CreateProcessNULL,cmd/*cmd.data*/,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi { WaitForSingleObjectpi.hpProcess,无限; CloseHandlepi.hThread; CloseHandlepi.hProcess; } 否则,请将PowerShell命令放入.bat脚本中,例如:

@回音 PowerShell-命令压缩存档-路径\%0 \-DestinationPath\%1\ 然后您可以使用system/_wsystem运行该脚本,例如:

WCHAR cmd[MAX_PATH*2+25]={}; swprintfcmd,Lmyscript.bat\%s\\%s\,路径,目标路径; _wsystemcmd; std::wstring cmd=Lmyscript.bat\+path+L\\+DestinationPath+L\; _wsystemcmd.c_str;
系统运行cmd.exe/C的实例,其中是指定的参数。PowerShell.exe是一个单独的应用程序,具有自己的命令行参数。PowerShell.exe命令不是cmd.exe命令。使用CreateProcess,而不是直接运行PowerShell.exe。否则,将PowerShell命令放入.bat脚本中,然后使用system运行该脚本;处理信息处理信息;如果使用Create进程,“si”和“pi”是什么?这些是路径和目的地路径吗?另外,如果将PowerShell命令放入.bat脚本中,.bat脚本是否应保存在项目目录中?@Alyssa我向您展示了si和pi的确切含义。