操作平台: win2k代码:
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi;
TCHAR szPath[]=TEXT("c:\\windows\\PBRUSH.EXE");//创建一个新进程:
CreateProcess(NULL,szPath,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);//等待子进程终结:
DWORD dw=WaitForSingleObject(pi.hProcess,INFINITE);
switch(dw){
case WAIT_OBJECT_0:
MessageBox(NULL,"right 1","",0);
break;
case WAIT_TIMEOUT:
MessageBox(NULL,"right 2","",0);
break;
case WAIT_FAILED:
MessageBox(NULL,"right 3","",0);
break;
}结果是:子进程一创建,立刻就弹出MessageBox 1,即使更改等待的时间值,
也没任何效果. 按理该是子进程结束,才会MessageBox 1,请大虾看看,
在线等待..
up送分.

解决方案 »

  1.   

    DWORD dw=WaitForSingleObject(pi.hProcess,INFINITE);
    这意思是当等到 pi.hProcess有信号是才返回WAIT_OBJECT_0  你现在创建进程当然 pi.hProcess马上就是有信号了,所以会出现这样的结果.
      

  2.   

    代码没错,估计是c:\\windows\\PBRUSH.EXE执行得太快了,8-)
      

  3.   

    我的机器正好装了两个操作系统,我换成c:\winnt\system32\mspaint.exe就是好的,但使用c:\windows\pbrush.exe就不好,在win9x下面执行好像是没有问题的,我以前作过类似的代码。BOOL RegMspaintPath(char *path, int size)
    {
    BYTE szBuf[240];
    LONG ret;
    DWORD dwLen, dwType;
    HKEY hsub; memset(path, 0, size);
    ret = RegOpenKeyEx(
    HKEY_CLASSES_ROOT, 
    //以下注册键注册了mspaint的服务
    //ProgID -> Paint.Picture
    "CLSID\\{D3E34B21-9D75-101A-8C3D-00AA001A1652}\\LocalServer32", 
    0, 
    KEY_READ | KEY_QUERY_VALUE, 
    &hsub); if(ret == ERROR_SUCCESS)
    {
    dwLen  = sizeof(szBuf);
    dwType = REG_SZ;
    ret = RegQueryValueEx(hsub, NULL, NULL, &dwType, szBuf, &dwLen);
    if(ret == ERROR_SUCCESS)
    {
    strncpy(path, (char *)szBuf, size);
    path[size - 1] = 0;
    return TRUE;
    }
    } return FALSE;
    }/************************************************************************
    函数:StartMspaint
    作用:启动画笔编辑指定文件image,在画笔退出前等待dwMilliseconds毫秒。
    参数:
    image 传递的位图文件名称,不可为NULL
    dwMilliseconds 等待时间,单位和WaitForSingleObject对应的时间单位一
    样,都是毫秒。
    返回值:
    启动成功 TRUE
    启动失败 FALSE
    ************************************************************************/
    BOOL StartMspaint(const char *image, DWORD dwMilliseconds)
    {
    char szMspaint[_MAX_PATH], szCmd[_MAX_PATH * 2];
    PROCESS_INFORMATION pi;
    STARTUPINFO si;

    RegMspaintPath(szMspaint, sizeof(szMspaint));
    _snprintf(szCmd, sizeof(szCmd), "%s \"%s\"", szMspaint, image);
    szCmd[sizeof(szCmd) -1] = 0;

    memset(&si, 0, sizeof(si));
    si.cb = sizeof(si);
    si.wShowWindow = SW_SHOW;
    si.dwFlags=STARTF_USESHOWWINDOW;

    BOOL fRet=CreateProcess(NULL,
    szCmd,
    NULL,
    NULL,
    FALSE,
    NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE, //|CREATE_SUSPENDED,
    NULL,
    NULL,
    &si,
    &pi); if(! fRet)
    {//创建失败,显示错误信息
    LPVOID lpMsgBuf;
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL );
    AfxMessageBox( (LPCTSTR)lpMsgBuf);
    LocalFree( lpMsgBuf ); return FALSE;
    }
    else
    {
    // ResumeThread(pi.hThread ); if(LoadMapint("mpaint.dll"))
    {
    PROC_WINDOWS proc_windows; memset(&proc_windows, 0, sizeof(proc_windows));
    proc_windows.pid = pi.dwProcessId;
    EnumWindows(ListMsPaintWindow, (LPARAM)&proc_windows); if(hookmsg)
    {
    hookmsg(pi.dwProcessId,  proc_windows.tid);
    }
    } WaitForSingleObject(pi.hProcess , dwMilliseconds);
    } return TRUE;
    }我当时需要往mspaint.exe里面加载一个dll,修改一些界面,以上是我启动mspaint的代码,好像在win9x下面也是没有问题的,我不知道你是不是也是在win2k下面运行win9x的pbrush.exe,这样好像是有问题,用我的代码看看,有问题再告诉我。
      

  4.   


    to:chenm001(CM) 
        呵呵,偶的理解没错.to: oldworm(oldworm)     大虾,感谢. 的确,我把 "c:\\windows\\PBRUSH.EXE" 
    改成:"D:\\winnt\\NOTEPAD.EXE" 没有问题,如所预期的结果.
    可就疑惑了:换了其它的exe文件,也成. PBRUSH.exe是怎么会事?
      

  5.   

    to: In355Hz子进程的确是创建成功.就是WaitForSingleObject()的立即返回不合常理.
      

  6.   

    刚才看了一下PBRUSH.EXE的Dependencies,发现只引用了几个函数:
    ExitProcess
    GetCommandLineA
    GetModuleHandleA
    GetStartupInfoA
    ShellExecuteA
    原来这个程序仅仅执行ShellExecute(..., "mspaint.exe", ...);
    就立即退出,结果WaitForSingleObject立即得到信号。
      

  7.   

    刚才看了一下PBRUSH.EXE的Dependencies,发现只引用了几个函数:
    ExitProcess
    GetCommandLineA
    GetModuleHandleA
    GetStartupInfoA
    ShellExecuteA
    原来这个程序仅仅执行ShellExecute(..., "mspaint.exe", ...);
    就立即退出,结果WaitForSingleObject立即得到信号.
      

  8.   

    to:In355Hz(好象一条狗)牛,佩服.顺道请教一下,Dependencies是什么东东?一会送分.
      

  9.   

    to fanchka(狼仔):
    Dependencies是依赖的意思,就是导入了那些函数(API)