在程序中,运行其他程序

mxmkeep 2010-02-24 01:19:48
以下是书上的代码,功能是实现在程序中运行其他程序,用ShellExecute()函数就没问题,但是用CreateProcess()函数,失败的几率就很高,为什么呢?哪里错了,请问该怎么改?



//---------------------------------------------------------------------------

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));

}
//---------------------------------------------------------------------------
...全文
89 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2010-02-25
  • 打赏
  • 举报
回复
还没有搞定?
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));
lhy 2010-02-24
  • 打赏
  • 举报
回复
CreateProcess的第二个参数也要的。
cp_pan 2010-02-24
  • 打赏
  • 举报
回复
up up!!!
mxmkeep 2010-02-24
  • 打赏
  • 举报
回复
用了妖大叔的方法了...但是还是有问题,要到第三次开始,才正确跳出计数器...
I don't kown why...
zzbinfo 2010-02-24
  • 打赏
  • 举报
回复
楼上妖哥正解。呵呵。
ccrun.com 2010-02-24
  • 打赏
  • 举报
回复
char szPath[MAX_PATH] = { 0 };
::GetSystemDirectory(szPath, MAX_PATH);

AnsiString FileName = AnsiString().sprintf("%s\\Calc.exe", szPath);
...
周药师 2010-02-24
  • 打赏
  • 举报
回复
“AnsiString FileName;
FileName.SetLength(256);
FileName.SetLength(GetSystemDirectory(FileName.c_str(),
FileName.Length()));
FileName = FileName + "\\Calc.exe;

这段直接用AnsiString FileName = "XXXX\\Calc.exe ";
lhy 2010-02-24
  • 打赏
  • 举报
回复
你的path的问题。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧