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