在进程中找到EXE文件想得到它调用了那些DLL,
向反在进程中找到DLL,想知道那些程序调用了这个DLL。

解决方案 »

  1.   

    可以用DUMPBIN
    例:
    DUMPBIN /imports "pretty park.exe"
    微软网站下载
      

  2.   

    来晚了告诉你一个很绝的方法:把机器里的DLL一个一个删掉,在删掉一个后发现程序无法运行了,就是它了~~~~~
      

  3.   

    dafeifei(大飞飞) 
      你的方法我这是行不通的。
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      lppe: TProcessEntry32;
      found : boolean;
      Hand : THandle;
    begin
      Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
      found := Process32First(Hand,lppe);
      while found do
      begin
        ListBox1.Items.Add(StrPas(lppe.szExeFile));
        found := Process32Next(Hand,lppe);
      end;
    end;
    以上可以得出进程中的所有文件,我到时只会显示EXE进程,点击EXE文件想知道EXE调用了那些DLL,没有的话就是不显示。cg1120(代码最优化-§新年祝福你,好运伴着你§) 
    我想我要在DELPHI下完成。
      

  5.   

    vc中有个工具可以查看一个执行文件要用到哪些DLL不过名字我忘记了
      

  6.   

    有一种软件叫dllshow,你可以试试看这有下载:http://www2.yesky.com/34865152/114722.shtml
      

  7.   

    大家说的都是外部工具,可我是要用DELPHI写个程序了完成啊。
      

  8.   

    mrfanghansheng(***木鱼***) 
     要是你提供的程序有源码,呵呵。
      

  9.   

    mrfanghansheng(***木鱼***) 
     我还是要谢谢你。
      

  10.   

    那DELPHI本身所使用DLL不也看见了吗?是不是该了解DLL调用的机制了
      

  11.   

    tolimit(求学)
     我想是的,如DELPHI所调用的DLL在进程中有的话就显示出来。  
     有什么问题吗。
      

  12.   

    有一个方法,因为exe调用dll都要在address space内映射文件,所以只要遍历address space内的所有region就可以得到exe内的所有dll或者其他映射文件。 这样做有好处是可以找到动态调入的dll,也有坏处就是还没有调入的dll就不会看到。至于怎么遍历address space 请用 VirtualQueryEx 函数。
      

  13.   

    var
      ProcHand: Thandle;
      ModHandles: array[0..255] of DWORD;
      ModName: pchar;
      ModInfo: Tmoduleinfo;
      count: cardinal;
      i: integer;
    begin
        memo1.Lines.Clear;
        getmem(modname,MAX_PATH);
        ProcHand := OpenProcess(Process_All_Access, True, strtoint64(listbox2.Items[listbox2.ItemIndex]));
        if ProcHand = 0 then exit;
        EnumProcessModules(ProcHand, @ModHandles, SizeOf(ModHandles), Count);
        for I := 0 to (Count div SizeOf(DWORD)) - 1 do
        begin
          if (GetModuleFileNameEx(ProcHand, ModHandles[I], ModName, MAX_PATH) > 0) then
           memo1.Lines.Add(modname);
        end;
        application.MessageBox(pchar('这个进程共调用了'+inttostr(i)+'个模块'),'提示',MB_OK); 
        freemem(modname);
      

  14.   

    to dafeifei(大飞飞)
    你的方法果然管用.