我编写了一个C ++程序,使用ShellExecute函数修复属性并在列表框中显示结果
int USB::FixAttributes(wchar_t buffer[10])
{
PWSTR show = L"/c attrib -s -r -h *.* /s /d /l ";
ShellExecute(NULL, L"open", L"cmd.exe", show, buffer, SW_HIDE);
wchar_t* no1 = L"Attributes has been fixed successfully";
SendMessage(list1, LB_ADDSTRING, NULL, (LPARAM)no1);//add message to list box
return 0;
}
缓冲区只不过是一个驱动器字符串,例如H:\
但是在完成ShellExecute函数之前,消息("属性已成功修复")已添加到列表框中,从而提供了如何解决它的错误信息!
谢谢
答案 0 :(得分:1)
您使用了错误的功能来创建新流程。 ShellExecute
没有提供等待终止的方法。您的选择是:
ShellExecuteEx
。指定SEE_MASK_NOCLOSEPROCESS
以获取进程句柄。等待WaitForSingleObject
。等待完成后,子进程已终止。 CreateProcess
。这总是产生一个进程句柄,您可以在其上以相同的方式等待。 在这两种情况下,您必须关闭手柄以整理并避免泄漏。 CreateProcess
是创建流程的首选。它为您提供更多自由。例如,如果您愿意,可以避免显示控制台窗口。
说完所有这些之后,您最好不要在流程中完成所有工作,而不是创建子流程。这将允许您报告进度,更丰富的错误消息等。