急!!!!如何把内存中的DLL释放或强行终止.(最好有源代码) 先用CreateToolhelp32Snapshot,Process32First, Process32Next取进程,然后KillProcess 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to: zero1977(幻影) 这样不行的,我在程序里用loadlibrary('aaa.dll')后,用这种方法根本看不到aaa.dll 我也专门研究过这个问题。.DLL不能单独中止,它属于某些进程所有;即使单独中止了.DLL,所属进程却并不知晓,此进程就不稳定了;只要中止了所属进程,其.DLL就自动释放了,所以这个问题就可变成如何强行中止进程了,这个问题已解决; To BCB现在有很多的内存释放和优化软件,它们的工作原理基本上是什么样的呢? 如果你要把本进程内存中的DLL释放或强行终止可用Freelibrary、freemodul或其他相关函数就可。但你要释放或强行终止其他进程的dll或系统级的dll,那你就遇到麻烦了,win32API不提供这样的API函数。 to: BCB([email protected]) 你说的很对!有的软件可以知道进程都使用了那写DLL的信息.请问你知道取得进程使用的DLL的方法么?有谁知道请告知??? #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); } }}//--------------------------------------------------------------------------- Form1上 有ListBox1: 显示所有进程; ListBox2:显示某个进程的所有.DLL名 ; Button1: 列所有进程; Button2: 杀ListBox1中所选的进程; Button3: 列ListBox1所选进程的所有.DLL名;对于调试ISAPI的.DLL比较有效,将PWS的进程随时杀掉,.DLL就跟着释放了; 因为是API调用,所以将上面的C++改成DELPHI可能是小菜一碟! 请问各位大侠,javascript如何调用delphi函数!急!!! 关于BDE异常 如何设置屏幕分辨率? IT书超多的网站!!! http://www.netyi.net/in.asp?id=netyi123456 菜鸟问题快来看! 如何判斷一個臨時表是否存在﹖﹖﹖ 我怎么这么贱!!!! Delphi的帮助看不懂,VC的帮助还好一点,它把例子的答案都写出来了,而Delphi好像没有,至少我没发现? 数据库引擎用BDE还是ODBC? 高手请进,Ado问题,急急急! 如何删除一个已知道文件名和路径的文件?? 求 奥赛 青少年组 题目。。。最好有题目答案。。不胜感谢。!!
这样不行的,我在程序里用loadlibrary('aaa.dll')后,用这种方法根本看不到aaa.dll
.DLL不能单独中止,它属于某些进程所有;
即使单独中止了.DLL,所属进程却并不知晓,
此进程就不稳定了;只要中止了所属进程,
其.DLL就自动释放了,所以这个问题就可变成如何
强行中止进程了,这个问题已解决;
现在有很多的内存释放和优化软件,它们的工作原理基本上是什么样的呢?
你说的很对!有的软件可以知道进程都使用了那写DLL的信息.请问你知道取得进程使用的DLL的方法么?有谁知道请告知???
#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);
}
}
}
//---------------------------------------------------------------------------
ListBox2:显示某个进程的所有.DLL名 ; Button1: 列所有进程;
Button2: 杀ListBox1中所选的进程;
Button3: 列ListBox1所选进程的所有.DLL名;
对于调试ISAPI的.DLL比较有效,将PWS的进程随时杀掉,.DLL就跟着释放了;