取得某进程加载调用的所有dll.包括静态加载和动态加载.

解决方案 »

  1.   

    需要自己翻译一下
    http://msdn.microsoft.com/en-us/library/ms686849.aspx
      

  2.   

    找到一个Delphi版的,你可以试试uses tlhelp32;//根据进程名称获取进程ID
    function TForm1.GetProcessIDByName(const ProcessName: string): DWORD;
    var
        FSnapshotHandle: THandle;
        pe: PROCESSENTRY32;
    begin
        result := 0;
        FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        pe.dwSize := SizeOf(PROCESSENTRY32);
        if (Process32First(FSnapshotHandle, pe)) then
        begin
            while (Process32Next(FSnapshotHandle, pe)) do
            begin
                if (UpperCase(ExtractFileName(pe.szExeFile)) = UpperCase(ProcessName)) then
                begin
                    Result := pe.th32ProcessID;
                end;
            end;
        end;
        CloseHandle(FSnapshotHandle);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
        pid: dword;
        hnd: THandle;
        hModuleSnap: THandle;
        me32: MODULEENTRY32;
    begin
        pid := GetProcessIDByName(edit1.Text);
        hnd := openprocess(PROCESS_ALL_ACCESS, FALSE, pid);
        hModuleSnap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
        if hModuleSnap = INVALID_HANDLE_VALUE then 
            exit;
        me32.dwSize := SizeOf(MODULEENTRY32);
        if Module32First(hModuleSnap, me32) then
        begin
            repeat
                Memo1.Lines.Add(format('MODULE NAME: %s', [me32.szModule]));
                Memo1.Lines.Add(format('executable:  %s', [me32.szExePath]));
                Memo1.Lines.Add(format('process id:  %d', [me32.th32ProcessID]));
                Memo1.Lines.Add(format('ref count(g):%d', [me32.GlblcntUsage]));
                Memo1.Lines.Add(format('ref count(p):%d', [me32.ProccntUsage]));
                Memo1.Lines.Add(format('base address:%d', [DWORD(me32.modBaseAddr)]));
                Memo1.Lines.Add(format('base size:   %d', [me32.modBaseSize]));
            until not Module32Next(hModuleSnap, me32);
        end;
        CloseHandle(hModuleSnap);
    end;摘自:http://topic.csdn.net/u/20090725/11/69a3fa31-d978-4c3d-8c6c-b04dcd0bb322.html
      

  3.   

    也可以用OpenProcess,EnumProcessModules配合GetModuleFileNameEx来使用
    函数在PSAPI单元
      

  4.   

    昨天刚发帖就在pudn下了个例子
    散分,散分procedure GetModules(ProcessID : DWORD; pmList : TStringList);
    var
      hSnap       : THandle;
      ModuleEntry : TModuleEntry32;
      Proceed     : Boolean;
    begin
      pmList.Clear;
      hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID);
      if HSnap <> INVALID_HANDLE_VALUE then begin
        ModuleEntry.dwSize := SizeOf(TModuleEntry32);
        Proceed :=  Module32First(hSnap, ModuleEntry);
        while Proceed do
        begin
          with ModuleEntry do
            pmList.Add(ModuleEntry.szModule);
           Proceed := Module32Next(hSnap, ModuleEntry);
        end;
        CloseHandle(hSnap);
      end;
    end;