在我的程序A.exe中,需要启动B.exe,但希望能够在启动B.exe之前,检查B.exe是否已启动。
请大家能够给出尽量简单的方法,最好是通过现有的win32 api实现,
当然,如果没有这样的api,多条语句实现也可接受。
我使用VC6的开发环境。

解决方案 »

  1.   

    EnmuProcess枚举进程BOOL GetProcessList () 

        HANDLE         hProcessSnap = NULL; 
        BOOL           bRet      = FALSE; 
        PROCESSENTRY32 pe32      = {0}; 
     
        // 做一个系统中当前进程列表的快照     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);     if (hProcessSnap == INVALID_HANDLE_VALUE) 
            return (FALSE); 
     
        //  初始化PROCESSENTRY32结构    pe32.dwSize = sizeof(PROCESSENTRY32); 
     
        //  遍历进程列表,结构体pe32保存了进程的ID,进程名,优先级等信息,你可以利用这个结构来判断是不是你想要操作的进程。
        //      if (Process32First(hProcessSnap, &pe32)) 
        { 
     do
     {
      //在这里你可以对当前枚举到的进程进行处理,如果是你需要结果的进程,就
      //HANDLE hProcess=OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID);
      //if(!hProcess)
       //TerminateProcess(hProcess);
    //来结束进程。
     }
            while (Process32Next(hProcessSnap, &pe32)); 
            bRet = TRUE; 
        } 
        else 
            bRet = FALSE;    // could not walk the list of processes 
     
        // Do not forget to clean up the snapshot object.     CloseHandle (hProcessSnap); 
        return (bRet); 
      

  2.   

    没有简单的函数,只有遍历先 EnumProcesses 得到所有进程的pid, 然后遍历得到 pid和process name
    或者
    CreateToolhelp32Snapshot 
    Process32First 
    Process32Next ----------------------- 
    如果不想遍历,也可以执行如下命令行,判断进程是否在运行(XP及以上, win2k 貌似没有tasklist命令)
    tasklist /FI "imagename eq B.exe" /NH 
      

  3.   

    获取进程列表及其模块列表http://msdn.microsoft.com/en-us/library/ms682623.aspx
    http://msdn.microsoft.com/en-us/library/ms682621(VS.85).aspxlz 你说的只是这里面的小部分功能。
      

  4.   

    没实验过在B进程中HANDLE m_hMutex = CtrateMutex(NULL,m_pszAppName);
    if(GetLastError() == ERROR_ALREADY_EXISTX)
    {
       return FALSE
    }
      

  5.   


    现在我无法获得B.exe的源代码。
      

  6.   

    那就只能自己查找,枚举进程,然后就知道B。exe是否存在
      

  7.   

    那就用oyljerry 老大的方法!
      

  8.   

    用ProcessExplorer之类的工具看看有没有什么常驻的有名字的event、Mutex对象,如果有就可以直接拿来检查了。
    都没有的话只好枚举进程了。
      

  9.   

    如果B也是自己写的当然可以用 CtrateMutex来处理,这也是防止一个进程被多次执行的常用方法,如果B不是自己写的只能通过CreateToolhelp32Snapshot 
    Process32First 
    Process32Next 
    来处理了。
      

  10.   

    其实还有一种,lz 你为什么不限制 B.exe 只有一个实例呢?
    如果也是你自己开发的程序的话。只允许一个应用程序实例 
    http://blog.csdn.net/DavidHsing/archive/2009/04/30/4138378.aspx
      

  11.   

    不知道B.exe有没有窗口标题,如果知道可以用findwindow实现互斥: /************************************************************************/
    /* 互斥                                                                 */
    /************************************************************************/
    HANDLE m_hMutex;
    m_hMutex = ::CreateMutex(NULL, TRUE, "互斥名");
        if (GetLastError() == ERROR_ALREADY_EXISTS) //程序已经运行
        {
            HWND   oldHWnd = NULL;   
            oldHWnd = ::FindWindow(NULL, _T("B名字")); //查找已经运行的程序
            if (oldHWnd)   
            {   
                ::ShowWindow(oldHWnd, SW_SHOWNORMAL); //激活显示找到的已运行的程序
                ::SetForegroundWindow(oldHWnd);       //将已运行的程序设置为当前窗口
            }  
    else
    {
    //未运行,运行B
    }
            CloseHandle(m_hMutex);
            m_hMutex = NULL;
            return FALSE;
        }
      

  12.   


        /************************************************************************/
        /* 互斥                                                                 */
        /************************************************************************/
        HANDLE m_hMutex;
        m_hMutex = ::CreateMutex(NULL, TRUE, "互斥名");
        if (GetLastError() == ERROR_ALREADY_EXISTS) //程序已经运行
        {
            HWND   oldHWnd = NULL;   
            oldHWnd = ::FindWindow(NULL, _T("B名字")); //查找已经运行的程序
            if (oldHWnd)   
            {   
                ::ShowWindow(oldHWnd, SW_SHOWNORMAL); //激活显示找到的已运行的程序
                ::SetForegroundWindow(oldHWnd);       //将已运行的程序设置为当前窗口
            }  
            else
            {
                //未运行,运行B
            }
            CloseHandle(m_hMutex);
            m_hMutex = NULL;
        }去掉最后的 return FALSE;
      

  13.   

    枚举吧,好像在哪里看到过不建议使用互斥 Mutex
      

  14.   

    如果程序不是你自己写的,只能用枚举进程。HANDLE m_hfindhandle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    DWORD dCurrentId = GetCurrentProcessId();
    PROCESSENTRY32* info=new PROCESSENTRY32;
    info->dwSize=sizeof(PROCESSENTRY32);
    if(Process32First(m_hfindhandle,info)) 
    {
    while(Process32Next(m_hfindhandle,info)!=FALSE)
    {
    if (info->szExeFile == "abc.EXE")
    {
    if (dCurrentId != info->th32ProcessID)
    {
    HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,TRUE,info->th32ProcessID);

    if(h!=NULL)
    {
    Sleep(100);
    TerminateProcess(h,0);
    }
    }
    }
    }
    CloseHandle(m_hfindhandle);//关闭进程否则会出错
    if (info) 
    {
    delete info;
    }
    }