先用CreateToolhelp32Snapshot,Process32First, Process32Next取进程,然后KillProcess

解决方案 »

  1.   

    to:  zero1977(幻影) 
    这样不行的,我在程序里用loadlibrary('aaa.dll')后,用这种方法根本看不到aaa.dll  
      

  2.   

    我也专门研究过这个问题。
    .DLL不能单独中止,它属于某些进程所有;
    即使单独中止了.DLL,所属进程却并不知晓,
    此进程就不稳定了;只要中止了所属进程,
    其.DLL就自动释放了,所以这个问题就可变成如何
    强行中止进程了,这个问题已解决;
      

  3.   

    To BCB
    现在有很多的内存释放和优化软件,它们的工作原理基本上是什么样的呢?
      

  4.   

    如果你要把本进程内存中的DLL释放或强行终止可用Freelibrary、freemodul或其他相关函数就可。但你要释放或强行终止其他进程的dll或系统级的dll,那你就遇到麻烦了,win32API不提供这样的API函数。
      

  5.   

    to: BCB([email protected])
        你说的很对!有的软件可以知道进程都使用了那写DLL的信息.请问你知道取得进程使用的DLL的方法么?有谁知道请告知???
      

  6.   


    #include <vcl.h>
    #pragma hdrstop
    #include "ListUnit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    #include <tlHelp32.h>
    int  ProcessID[1024];  // 存放进程标识号
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {     // 显示进程列表
          HANDLE   ProcessListHandle=
              CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
              // 产生进程列表句柄
          ListBox1->Items->Clear();
          int i=0;      PROCESSENTRY32  ProcessStruct;
          ProcessStruct.dwSize=sizeof(ProcessStruct);
          int yn=Process32First(ProcessListHandle,
                                 &ProcessStruct);
          while (yn!=0)
             {
                 ProcessID[i++]=ProcessStruct.th32ProcessID;
                 ListBox1->Items->Add(ProcessStruct.szExeFile);
                 yn=Process32Next(ProcessListHandle,&ProcessStruct);
             }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {    // 强行中止进程
         int i=ListBox1->ItemIndex;
         if (i!=-1)
            {
               int pID=ProcessID[i];
               HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,true,pID);
               DWORD ExitCode;
               GetExitCodeProcess(h,&ExitCode); // 取中止码
               TerminateProcess(h,ExitCode);    // 强行中止
               Sleep(100);                      // 延时100ms
               Button1->Click();                // 重新列表
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
         Button1->Click();
    }
    int  ModuleID[1024];  // 存放DLL标识号
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {    // 显示某进程的所有DLL名
         int i=ListBox1->ItemIndex;
         if (i!=-1)
            {
               int pID=ProcessID[i];  // 列这个进程的DLL名
               HANDLE   ModuleListHandle=
                        CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pID);
               ListBox2->Items->Clear();
               int j=0;
               MODULEENTRY32  ModuleStruct;
               ModuleStruct.dwSize=sizeof(ModuleStruct);
               int yn=Module32First(ModuleListHandle,
                               &ModuleStruct);
               while (yn!=0)
                 {
                   ModuleID[j++]=ModuleStruct.th32ModuleID;
                   ListBox2->Items->Add(ModuleStruct.szExePath);
                   yn=Module32Next(ModuleListHandle,&ModuleStruct);
                 }
            }
    }
    //---------------------------------------------------------------------------
      

  7.   

    Form1上 有ListBox1: 显示所有进程;
             ListBox2:显示某个进程的所有.DLL名 ;         Button1:  列所有进程; 
             Button2:  杀ListBox1中所选的进程;
             Button3:  列ListBox1所选进程的所有.DLL名;
    对于调试ISAPI的.DLL比较有效,将PWS的进程随时杀掉,.DLL就跟着释放了;
     
      

  8.   

    因为是API调用,所以将上面的C++改成DELPHI可能是小菜一碟!