在程序中,运行其他程序 - C++ Builder / Windows SDK/API
以下是书上的代码,功能是实现在程序中运行其他程序,用ShellExecute()函数就没问题,但是用CreateProcess()函数,失败的几率就很高,为什么呢?哪里错了,请问该怎么改?
- C/C++ code
//---------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender){ AnsiString Path; Path.SetLength(256); Path.SetLength(GetSystemDirectory(Path.c_str(),Path.Length())); ShellExecute(this->Handle,"open","Calc.exe",NULL,Path.c_str(),SW_SHOWNORMAL);}//---------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){ AnsiString FileName; FileName.SetLength(256); FileName.SetLength(GetSystemDirectory(FileName.c_str(), FileName.Length())); FileName = FileName + "\\Calc.exe"; LPSTARTUPINFO StartupInfo = new STARTUPINFO; SECURITY_ATTRIBUTES *psap = new SECURITY_ATTRIBUTES; psap->lpSecurityDescriptor = NULL; psap->bInheritHandle = true; psap->nLength = sizeof(psap); SECURITY_ATTRIBUTES *psat = new SECURITY_ATTRIBUTES; psat->lpSecurityDescriptor = NULL; psat->bInheritHandle = true; psat->nLength = sizeof(psat); LPPROCESS_INFORMATION newProcess = new PROCESS_INFORMATION; int res = CreateProcess(FileName.c_str(),NULL,psap,psat,true, CREATE_SEPARATE_WOW_VDM | DETACHED_PROCESS | NORMAL_PRIORITY_CLASS, NULL,NULL,StartupInfo,newProcess); int i = GetLastError(); ShowMessage(IntToStr(res)+" "+IntToStr(i));}//---------------------------------------[解决办法]
还没有搞定?
- C/C++ code
char szPath[MAX_PATH] = { 0 };
::GetSystemDirectory(szPath, MAX_PATH);
AnsiString FileName = AnsiString().sprintf("%s\\Calc.exe", szPath);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
SECURITY_ATTRIBUTES psap;
psap.lpSecurityDescriptor = NULL;
psap.bInheritHandle = true;
psap.nLength = sizeof(psap);
SECURITY_ATTRIBUTES psat;
psat.lpSecurityDescriptor = NULL;
psat.bInheritHandle = true;
psat.nLength = sizeof(psat);
BOOL bRet = ::CreateProcess(
FileName.c_str(),
NULL,
&psap,
&psat,
true,
CREATE_SEPARATE_WOW_VDM | DETACHED_PROCESS | NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi);
DWORD dwLastError = ::GetLastError();
ShowMessage(AnsiString().sprintf("CreateProcess执行%s GetLastError: %d",
bRet? "成功.": "失败!", dwLastError));