delphi如何用程序实现探测当前系统的所有进程,并终止某一进程。请高手帮助!!!!!现在做一软件自动升级,想升级时,如果当前自己的应用程序运行时自动关闭它。然后再进行下面的操作。高手指教。在线等待!!1

解决方案 »

  1.   

    遍历所有进程,我现在还没有做过(csdn中肯定有,你自己找一下吧),至于找固定或者说找你那个程序有没有启动,我到是可以告诉你怎么做。我用C++ Builder写的
    step 1: 重载软件程序主窗体Create构造函数(第一个窗体)
    void __fastcall MForm1::CreateParams(TCreateParams & Params)
    {
          MForm::CreateParams(Params);
          strcpy(Params.WinClassName,"Rikky");   //设置应用程序名称为Rikky
    }step 2: 在升级程序中加入检测程序Rikky有没有实例在运行,(这样的话,升级程序和软件主程序Rikky必须是两个程序,当然软件主程序可以调用一个)
    //----
        HWND hWndCalc=FindWindow("Rikky",NULL);
        if(hWndCalc>0)
        {
             ShowMessage("已经运行了");
             //此处加入你想做的事,也就是关闭它
         }
    //----
        //下面开始初始化工作,以及创建窗体
        Application->Initialize();
      

  2.   

    各位高手,我想取得:进程名称、进程id、进程所占用的内存以及该进程的模块名称(线程),就像windows优化大师的进程管理一样。如何实现!在线等待!!!!
      

  3.   

    http://expert.csdn.net/Expert/topic/1589/1589297.xml?temp=.3507959是在懒的在贴了,自己看吧……他没结贴,楼主不会吧^_^
      

  4.   

    现在tprocessentry32.szexefile取到是每个进程的名称,并没有包括路径啊!我操作系统是2000,这是为什么啊!怎么样才能到每个进程的中径啊!并且是中文也能显示。如何取得每个进程的dll文件
      

  5.   

    枚举线程,模块,堆procedure TForm2.GetAllSub;
    var
      hSnap : THandle;
      TTHe : TTHreadEntry32;
      TMod : TModuleEntry32;
     // THL : THeapList32;
     // THE : THeapEntry32;
    begin
      hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPALL,0);
      TTHe.dwSize := SizeOf(TTHreadEntry32);
      TMod.dwSize := SizeOf(TModuleEntry32);
    //  THL.dwSize := SizeOf(THeapList32);
    //  THE.dwSize := SizeOf(THeapEntry32);
      if Thread32First(hSnap,TThe) then begin
        Repeat
          if TTHe.th32OwnerProcessID = PP(ID)^.ProcessID then begin
            with ListView1.Items.Add do begin
              Caption := Format('%x',[TThe.th32ThreadID]);
              SubItems.Add(Format('%d',[TThe.cntUsage]));
              SubItems.Add(inttostr(TThe.tpBasePri));
              SubItems.Add(inttostr(TThe.tpDeltaPri))
            end ;
          end;
        until NOT Thread32Next(hSnap,TThe);
      end;
      CloseHandle(hSnap);
        hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPMODULE,PP(ID)^.ProcessID);
      if Module32First(hSnap,TMod) then begin
        Repeat
          with ListView2.Items.Add do begin
            Caption := (TMod.szModule);
            SubItems.Add(TMod.szExePath);
            SubItems.Add(inttostr(TMod.GlblcntUsage));
            SubItems.Add(inttostr(TMod.ProccntUsage));
            SubItems.Add(inttostr(TMod.modBaseSize));
          end;
        until NOT Module32Next(hSnap,TMod);
      end;
      CloseHandle(hSnap);
     // showmessage(inttostr(dword(ID^)));
      hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPALL,PP(ID)^.ProcessID);
      if Heap32ListFirst(hSnap,THL) then begin
        repeat
          if Heap32First(THE,THL.th32ProcessID,THL.th32HeapID) then begin
            repeat
              with ListView3.Items.Add do begin
                Caption := Format('%x',[THL.th32HeapID]);
                SubItems.Add(Format('%x',[THE.dwAddress]));
                SubItems.Add(inttostr(THE.dwBlockSize));
                SubItems.Add(inttostr(THE.dwFlags));
              end;
            until NOT Heap32Next(THE);
          end;
        until NOT Heap32ListNext(hSnap,THL);
      end;
      CloseHandle(hSnap);
    end;
      

  6.   

    { TODO : 先取得所有进程名称,每取得一个进程名就发送一个 }
    procedure tform1.getclienttask(); //取得客户端的所有进程
    const
      PROCESS_TERMINATE=$0001;
      //进程的PROCESS_TERMINATE访问权限
    var
      SendCode:array[0..250] of char;
      SendCodeStr:string;
      ContinueLoop: BOOL;
      FSnapshotHandle: THandle;
      FProcessEntry32: TProcessEntry32;
    begin
      FSnapshotHandle := CreateToolhelp32Snapshot
                         (TH32CS_SNAPPROCESS, 0);
     //获取系统所有进程快照
      FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
      //调用Process32First前用Sizeof(FProcessEntry32)填充FProcessEntry32.dwSize
      ContinueLoop := Process32First(FSnapshotHandle,
                                     FProcessEntry32);
     //获取快照中第一个进程信息并保存到FProcessEntry32结构体中
      while integer(ContinueLoop) <> 0 do
        begin
           Sendtaskname:=ExtractFileName(FProcessEntry32.szExeFile);
              begin
                   sendCodeStr:='task'+sendtaskname;
                   StrpCopy(sendCode,sendCodeStr);
                   cUDP.RemoteHost:='192.168.0.13';
                   cUDP.SendBuffer(sendCode,250);
              end;
           ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
        end;
    end;
      

  7.   

    to: yansea(思宏) 代码如下: var
         prochand:Thandle;
         ModHand: HMODULE;
         modname:array [0..max_path] of char;
         //str:string;
         //cb_m:integer;
         count:dword;
    begin
       ProcHand := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
          False, getcurrentprocessid());
       if prochand>0 then
          begin
            enumprocessmodules(prochand,@modhand,1,count);
            if getmodulefilenameex(prochand,modhand,modname,sizeof(modname))>0 then
               begin
                 //getmodulefilenameex(prochand,modhand,modname,sizeof(modname));
                 showmessage(modname);
               end;
          end;
    end;但modname取得总是“?D?“,我代码错在哪里?
      

  8.   

    getmodulefilenameex要求传递process handle和module handle,看看参数对不对
      

  9.   

    我是process handle ,我是通过openprocess取得的!