读书人

在程序中运行其他程序解决办法

发布时间: 2012-02-25 10:01:47 作者: rapoo

在程序中,运行其他程序 - 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));

读书人网 >C++ Builder

热点推荐