为什么用如下代码,有很多系统程序的模块路径无法找到。
我发现那些系统程序,得到的句柄数字都很大而且相同。
请问这么解决
谢谢源代码如下
############################
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TLHelp32, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;  Type
  TProcessInfo = Record
    ExeFile : String;
    ProcessID : DWORD;
End;
pProcessInfo = ^TProcessInfo;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
Var
  p : pProcessInfo;
  IsLoopContinue:BOOL;
  FSnapshotHandle:THandle;
  FProcessEntry32:TProcessEntry32;  FModuleEntry32:TModuleEntry32;
  FModuleHandle:THandle;
Begin {1}
  memo1.Clear;
  FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); // 创建系统快照
  FProcessEntry32.dwSize:=Sizeof(FProcessEntry32); // 必须先设置结构的大小
  IsLoopContinue:=Process32First(FSnapshotHandle,FProcessEntry32); //得到第一个进程信息
  while Integer(IsLoopContinue)<>0 do
  Begin {2}
    New(p);
    p.ExeFile := FProcessEntry32.szExeFile;
    p.ProcessID := FProcessEntry32.th32ProcessID;
//****************************************************************
    FModuleHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,FProcessEntry32.th32ProcessID);
    FModuleEntry32.dwSize:=Sizeof(FModuleEntry32);
    if Module32First(FModuleHandle,FModuleEntry32) then //得到第一个进程信息
    memo1.Lines.Add(FModuleEntry32.szexepath);
//****************************************************************
    IsLoopContinue:=Process32Next(FSnapshotHandle,FProcessEntry32); // 继续枚举
  End; {2}
  CloseHandle(FSnapshotHandle); // 释放快照句柄
end;end.

解决方案 »

  1.   

    Module32First为什么不和Module32Next一起配套使用???
    ===================================================void __fastcall TForm1::ListProcessModule(DWORD dwProcessId)
    {
      HANDLE hSnapshot;
      HANDLE hProcess;
      MODULEENTRY32 ModEntry32;
      bool Result;  ModLV->Items->BeginUpdate();
      ModLV->Items->Clear();  hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessId);  hSnapshot = CreateToolhelp32Snapshot((DWORD)TH32CS_SNAPMODULE,dwProcessId);  ModEntry32.dwSize = sizeof(MODULEENTRY32);
      Result = Module32First(hSnapshot,&ModEntry32);
      while(Result)
      {
        if(ModEntry32.th32ProcessID != dwProcessId)
          continue;    TListItem *Item = ModLV->Items->Add();    //摸块名
        Item->Caption = AnsiString(ModEntry32.szExePath);    //入口地址(摸块句柄)
        Item->SubItems->Add(IntToHex((int)ModEntry32.hModule,8));    //基地址,EntryPoint就是模块的入口点,从这个地方开始读
        MODULEINFO mi;    GetModuleInformation(hProcess,ModEntry32.hModule,&mi,sizeof(MODULEINFO));
        Item->SubItems->Add(IntToHex((int)mi.EntryPoint,8));    //占用内存
        Item->SubItems->Add(IntToStr(ModEntry32.modBaseSize / 1024) + " K");    Result = Module32Next(hSnapshot,&ModEntry32);
      }
      
      CloseHandle(hSnapshot);
      CloseHandle(hProcess);  ModLV->Items->EndUpdate();
    }
    //---------------------------------------------------------------------------
      

  2.   

    现是CSDN是没人气了,一个问题,问了几个月了,没人来答,也没人关注,
    我也都好几个月不爱来了,没径还有字体,怎么还是这样啊,
      

  3.   

    谁也没得(你)半点小恩小贿``~~~~
    爱回复者回复,不爱回复者拍拍屁股看了就走人
    >>>>>>>>>>>> 网络无限自由 <<<<<<<<<<<<<
      

  4.   

    用 psapi 看看
    你可以到搜索引擎上看看