大家好!小弟刚刚接触VB,遇到一个比较麻烦的问题:用外部程序(a.exe)处理存储在一个collection中的一系列文件名。要求处理完一个再处理下一个。
我起初想用
For Each s In collec
s = CStr(s)
Shell ("a " & s)
Next
可是发祥他同时处理了collection中的所有文件,如何一个一个的处理呢?
我的想法是调api,判断当前是否有a.exe在运行,如果没有,则处理下一个,这难免要疯狂的通过循环来判断,降低了性能。
也许通过捕捉操作系统发出的a.exe执行结束的消息,也可以实现,不过我不清楚操作系统是否发这种消息,在程序的什么时间中如何捕捉,谢谢!!

解决方案 »

  1.   

    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=18848
    枚举正在运行的进程
      

  2.   

    我有vc的,原理是这样的
    定义一个大的数组
    dim a( 0 to 4095) as long
    然后使用enumprocess来得到所有的进程并且返回进程数量
    如果成功了,可以用getmodulename来得到文件名。
    void CPtbView::IsAppRun(CString modulename)
    {
        DWORD buf[4096];
        DWORD num;
        TCHAR filenamebuf[_MAX_PATH+1];
        HMODULE hModule;
        DWORD cbReturned;
        BOOL bret=EnumProcesses(buf,4095,&num);
        bool bfound=false;
        CString msg;
        
        if(!bret)
        {
            AfxMessageBox("Error EnumProcesses");
            return;
        }
        
        for(int i=0;i<(int)num;i++)
        {
            HANDLE hProcess =OpenProcess(PROCESS_QUERY_INFORMATION&brvbar; PROCESS_VM_READ,false,buf[i]);
            if(hProcess ==NULL)
                continue;
            bret=EnumProcessModules(hProcess ,&hModule, sizeof(hModule), &cbReturned );
            if(bret)
            {
                DWORD dwret=GetModuleFileNameEx(hProcess ,hModule,filenamebuf,_MAX_PATH);
                CloseHandle( hProcess  ) ;
                if(dwret==0)
                {
                    msg.Format("%d",GetLastError());
                    AfxMessageBox(msg);
                    break;
                }
                else
                {
                    TCHAR* pfind=_tcsstr(filenamebuf,modulename);
                    if(pfind)
                    {
                        bfound=true;
                        break;
                    }
                }
            }
        }
        if(bfound)
            AfxMessageBox("Found it");
        else
            AfxMessageBox("Not found");
    }void CPtbView::OnViewCheckrun()
    {
        IsAppRun("notepad.exe");
    }