可以在定时器里用createprocess运行新程序吗?

fromv 2004-03-16 01:24:29
我想在定时器里用createprocess运行新程序,可是新程序新程序总是显示不出,而创建的代码确实成功运行了。这是怎么回事?
...全文
43 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxghj 2004-03-16
  • 打赏
  • 举报
回复
以下这段程序可以运行,看看是不是你的"ssfCntrl.exe"有问题
void CtfDlg::OnTimer(UINT nIDEvent)
{
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;

ZeroMemory( &StartupInfo, sizeof(StartupInfo) );
StartupInfo.cb = sizeof(StartupInfo);
ZeroMemory( &ProcessInfo, sizeof(ProcessInfo) );

if(!CreateProcess("c:\\winnt\\system32\\notepad.exe", NULL, NULL,NULL,FALSE,0,NULL, NULL,&StartupInfo,&ProcessInfo))
{
TRACE(" The process could not be started.");
}
else{
::WaitForInputIdle (ProcessInfo.hProcess, 3000);
if(OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE,FALSE,ProcessInfo.dwProcessId))
{
TRACE(" start a new thread success.");
}
else{
TRACE(" start a new thread fail.");
}
}
KillTimer(100);
}
fromv 2004-03-16
  • 打赏
  • 举报
回复
在settimer之前将STARINFO结构和PROCESSINFO结构清了
vcforever 2004-03-16
  • 打赏
  • 举报
回复
从代码上没看出什么问题试一下在CreateProcess之前将STARINFO结构和PROCESSINFO结构清一下0,并计算出结构体的大小
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
pi.cb = sizeof(pi);
fromv 2004-03-16
  • 打赏
  • 举报
回复
好不容易才进来。代码如下:
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent == 1)
{
HWND hTest = ::FindWindow( NULL, stmp );
GetWindowThreadProcessId(hTest,&hProcId);
HANDLE nOK = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ| PROCESS_VM_WRITE,FALSE,hProcId);

if(nOK != NULL)
{
TerminateProcess(nOK,0);
OnSaveLog(" kill a died thread."); if(!CreateProcess("ssfCntrl.exe", NULL, NULL,NULL,FALSE,0,NULL, NULL,&StartupInfo,&ProcessInfo))
{
OnSaveLog(" The process could not be started.");
}
else{::WaitForInputIdle (ProcessInfo.hProcess, 3000);
if(OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE,FALSE,ProcessInfo.dwProcessId))
{
OnSaveLog(" start a new thread success.");
}
else{ OnSaveLog(" start a new thread fail.");}
}
}
...
可以看到执行到了start a new thread success

vcforever 2004-03-16
  • 打赏
  • 举报
回复
在定时器中创建新的进程是可以的!
vcforever 2004-03-16
  • 打赏
  • 举报
回复
>>>>>而创建的代码确实成功运行了
成功运行了,不代表你的组子进程就成功启动了,看看你的CreateProcess函数的返回值,如果返回非0值说明创建子进程成功,如果返回0,说明创建子进程失败!

创建进程失败的原因看看你指定的可执行文件是否存在,路径是否正确
liotion 2004-03-16
  • 打赏
  • 举报
回复
可以
cxghj 2004-03-16
  • 打赏
  • 举报
回复
贴出你的代码
fromv 2004-03-16
  • 打赏
  • 举报
回复
解决了,程序代码没有问题。问题在TerminateProcess。调用后应该延时。
fromv 2004-03-16
  • 打赏
  • 举报
回复
ssfCntrl.exe没有问题。这段代码在CMainFrame的oncreate函数体里面执行很正常。放到timer里执行到start a new thread success.了。说明代码是正确的,但是ssfCntrl.exe的窗体没有出现,也没有相应的进程。
所以应该是在ontimer处理的方式有问题。
本意是想在监视一个程序的运行情况,发现他没有反应则杀掉并重新启动。
vcforever 2004-03-16
  • 打赏
  • 举报
回复
像楼上说的看看你的ssfCntrl.exe有没有问题

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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