ShellExecuteEx

解决方案 »

  1.   

    这个函数能在调用另一个可执行文件的时候,等待它返回吗?并把返回值返回给这个函数吗?也就是“阻塞式执行“吗?我看了书,书上好象说,这个函数以及上面那位网友说的ShellExecuteEx,都是调用了以后,生成一个新进程,并不等待该进程执行完毕返回其返回值。我需要的是等待这个可执行文件执行完毕并返回值。这两个函数哪个行?
      

  2.   

    所谓“在A中执行B”是不可能的,只能是“在A中调用B”。首先,程序的执行是由系统解释的,若你要在A中调用B,则你必须完成对B的运行解释,再交由系统执行。
    在A中调用B会使B生成一个新进程,要阻塞A进程只能靠你的A程序中自行阻塞,但保留与进程B的通信,在收到B结束的消息后再自行解锁。
      

  3.   

    CreateProcess 肯定可以。
      

  4.   


    UINT ProcessStatus(LPVOID pParam)
    {
        PROCESS_INFORMATION pi;
        STARTUPINFO si;
        si.cb=sizeof(si);
        si.wShowWindow=SW_SHOW;
        si.dwFlags=STARTF_USESHOWWINDOW;
        BOOL fRet=CreateProcess(NULL,
                      "d:\\temp\\disk1\\setup.exe -r",
                      NULL,
                      NULL,
                      FALSE,
                      NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,
                      NULL,
                      NULL,
                      &si,
                      &pi);
        if(fRet)
        {
            m_hPro=pi.hProcess;//保存当前进程句柄,在强制结束进程时使用。
        }
        if(::WaitForSingleObject(m_hPro,INFINITE)==WAIT_OBJECT_0)
        {
             AfxMessageBox("the Process is go over");
        }
        CloseHandle(m_hPro);
        return 0;
    }
      

  5.   

    非常感谢!你这一段代码好象能让A进程等待调用的那个可执行文件(B进程)结束,再继续执行A进程下面的语句,那能不能获取B进程的返回值呢?这个很重要。我需要知道B进程执行结果。(另:这两个进程都是我编的,可以在B进程里添加语句,为什么要通过A进程调用B进程这种复杂的方式而不是直接放到一个进程里?是因为我的是一个输入法的安装程序,要想32位系统和64位系统都适应,必须安装程序是32位的,如果是64位的在32位系统下根本无法运行,而输入法的注册又必须用64位程序来完成,否则只有一个能用另一个不能用。这就导致了必须用32位的安装程序,调用64位的程序去注册的问题)
      

  6.   

    非常感谢!你这一段代码好象能让A进程等待调用的那个可执行文件(B进程)结束,再继续执行A进程下面的语句,那能不能获取B进程的返回值呢?这个很重要。我需要知道B进程执行结果。(另:这两个进程都是我编的,可以在B进程里添加语句,为什么要通过A进程调用B进程这种复杂的方式而不是直接放到一个进程里?是因为我的是一个输入法的安装程序,要想32位系统和64位系统都适应,必须安装程序是32位的,如果是64位的在32位系统下根本无法运行,而输入法的注册又必须用64位程序来完成,否则只有一个能用另一个不能用。这就导致了必须用32位的安装程序,调用64位的程序去注册的问题)
    GetExitCodeProcess(m_hPro, &dwExitCode);
    就行。
      

  7.   

    应该用CreateProcess()靠谱,ShellExecuteEx只是执行外壳程序。