以下是我的代码:
var
  I:integer;
  Count:DWORD;
  ProcHand:THandle;
  ModHand:HModule;
  ModName:array [0..MAX_PATH] of char;
  ListItem: TListItem;
  temp:integer;
begin
  Refresh;
   for I:=Low(FProcList) to High(FProcList) do
  begin
    ProcHand:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
                          false,FProcList[I]);
    if ProcHand>0 then
        EnumProcessModules(ProcHand,@ModHand,1,Count);
        temp:=GetModuleBaseName(ProcHand,ModHand,ModName,Sizeof(ModName));
        if I=2 then
        if temp>0 then
        showmessage('yes')
        else
        showmessage('no');
        ListItem := ListView1.Items.Add;
        ListItem.Caption :=StrPas(ModName);
        ListItem.SubItems.Add(Inttostr(FprocList[I]));
        ListItem.SubItems.Add(IntTostr(ProcHand));其中:Refresh是一个方法,获得进程ID,保存到FProcList中,FProcList是保存进程ID的动态数组,经证明是正确的
可是为什么,标示ModName是显示不出来,全部是'W!'这种怪吗,而其他的如果
FprocList[I],和ProcHand则可以正确显示。
请高手指点呀。

解决方案 »

  1.   

    上面的temp是我做的试验,返回值是0即GetModuleBaseName返回的值是0
    这到到底是为什么呀
      

  2.   

    void __fastcall TTaskMon::ToolButton9Click(TObject *Sender)
    {  DWORD processIDs[0x3FFF] ; //进程ID
      DWORD Count ;
      int i ;
      void* ProcHand; //进程的句柄
      HMODULE ModHand; //模块的句柄
      char ModName[MAX_PATH]; //模块文件名
    //------------------------------------------   tvProcessTree->Items->Clear();//列举所有正在运行的进程
      if (!EnumProcesses(processIDs, sizeof(processIDs), &Count))
        MyMsgBox("列举进程出错,确认是否安装了PSAPI->DLL!","^^",0);
      int count1=(int)Count/sizeof(DWORD);
      for (i=0;i<count1;i++)
        {
          ProcHand = OpenProcess(PROCESS_QUERY_INFORMATION || PROCESS_VM_READ,False, processIDs[i]); //查询方式打开进程
          if (ProcHand > 0)
          try
            //列举进程的首模块
          {
            if (EnumProcessModules(ProcHand, &ModHand, sizeof(ModHand), &Count))
            //获取模块的文件名
            
              if (GetModuleFileNameExA(ProcHand, ModHand, ModName,sizeof(ModName)) > 0)
                {
                CNewProcess *cp=new CNewProcess;
                }        }
          __finally
           {
            CloseHandle(ProcHand);
            }
        }
    }
      

  3.   

    有没有人给出Delphi的例子呀,分可以再加的
    或者论坛一下我的程序的问题啊,
      

  4.   

    (注意uses TLHelp32)然后var lppe: TProcessEntry32;found : boolean;Hand : THandle;beginHand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);found := Process32First(Hand,lppe);while found dobeginListBox.Items.Add(StrPas(lppe.szExeFile));//列出所有进程。found := Process32Next(Hand,lppe);end;end;
      

  5.   

    uses ... TLHelp32, ...typeTForm1 = class(TForm)...end;varForm1: TForm1;l : Tlist; ////返回的东东在"L"这个TList中。typeTProcessInfo = RecordExeFile : String;ProcessID : DWORD;end;pProcessInfo = ^TProcessInfo;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);var p : pProcessInfo;i : integer;ContinueLoop:BOOL;varFSnapshotHandle:THandle;FProcessEntry32:TProcessEntry32;beginl := TList.Create;l.Clear;FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);while integer(ContinueLoop)<>0 dobeginNew(p);p.ExeFile := FProcessEntry32.szExeFile;p.ProcessID := FProcessEntry32.th32ProcessID;l.Add(p);ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);end;end;procedure TForm1.FormDestroy(Sender: TObject);var p : pProcessInfo;i : integer;beginWith l dofor i := Count - 1 DownTo 0 dobegin p := items[i]; Dispose(p); Delete(i); end;end;...end.