如何在外部释放内存中的DLL?

mytree 2000-03-03 01:15:00
我在编ISAPI,可是不会把DLL释放掉。
DLL是在IE里调的,用了pws.。
我想编一个DELPHI程序释放内存里的DLL,
可是费了九牛二虎之力怎么调Winapi也不行.
...全文
220 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mytree 2000-03-05
  • 打赏
  • 举报
回复
我用了上面AcherMagic大哥的方法,只是列出了当前任务(用Ctrl+Alt+Del可以调
出),而非当前的模块(module)(用word的About中的系统信息可以查看,当前活动
32位模块)我的DLL是一个模块。故用AcherMagic的方法看不到,我又把程序里的
process改为module,还是不行,气死我了!
KXY大哥的方法我也试过,可是在 IDE里一运行程序调试,一秒不到就出来了。第二
次气死我了!!
patpat 2000-03-04
  • 打赏
  • 举报
回复
luo那里可以看到这个例程
lu0 2000-03-04
  • 打赏
  • 举报
回复
MSJ 1998年文章.具体哪个月忘记了.
lu0 2000-03-03
  • 打赏
  • 举报
回复
MSJ有个例程,乃是大名鼎鼎的 Matt Pietrek写的NUKEDLL.真是
DLL杀手也.任何DLL都可以杀.:)尝试用它干调KERNEL32.DLL吧...
啊们...

太大了,贴不上来.:(
讲解一下主要步骤吧.
1.首先打开目标进程.
2.将自己的代码注入目标进程.9X和NT的有点不一样... :)
3.调用FREELIBRARY多次,至该DLL的REF COUNT为0.:)
DONE:D
Lin 2000-03-03
  • 打赏
  • 举报
回复
我有一个程序,可以做这样的工作.不管是进程,还是线程,通通可以Kill,要不要?可惜只支持Win9x.我正在尝试编个NT下的,快完了.
另外,你可以去软件发布,找找'任务管理',是个测试版的,功能不完.
sess 2000-03-03
  • 打赏
  • 举报
回复
如果是调试DLL,那么只有关机
AcherMagic 2000-03-03
  • 打赏
  • 举报
回复
这有一自编的例子

Private
ProcId : Array[0..30] of LongWord;

//Get All Process
procedure TForm1.ToolButton1Click(Sender: TObject);
var
ProcessInfo : tagPROCESSENTRY32;
Handle : THandle;
Node : TListItem;
i : Integer;
begin
i :=1;
ListView.Items.Clear ;
Handle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) ;
ProcessInfo.dwSize := SizeOf(ProcessInfo);
if Process32First(Handle,ProcessInfo) then
begin
Node := ListView.Items.Add;
Node.Caption := IntToHex(ProcessInfo.th32ProcessID,8);
Node.SubItems.Add(IntToStr(ProcessInfo.th32ProcessID));
Node.SubItems.Add(ProcessInfo.szExeFile);
Node.SubItems.Add(IntToStr(ProcessInfo.cntUsage));
Node.SubItems.Add(IntToHex(ProcessInfo.th32DefaultHeapID,8));
Node.SubItems.Add(IntToHex(ProcessInfo.th32ModuleID,8));
Node.SubItems.Add(IntToStr(ProcessInfo.cntThreads));
Node.SubItems.Add(IntToHex(ProcessInfo.th32ParentProcessID,8));
Node.SubItems.Add(IntToStr(ProcessInfo.pcPriClassBase));
ProcId[0] := ProcessInfo.th32ProcessID ;
end;
while Process32Next(Handle,ProcessInfo) do
begin
Node := ListView.Items.Add;
Node.Caption := IntToHex(ProcessInfo.th32ProcessID,8);
Node.SubItems.Add(IntToStr(ProcessInfo.th32ProcessID));
ProcId[i] := ProcessInfo.th32ProcessID ;
Node.SubItems.Add(ProcessInfo.szExeFile);
Node.SubItems.Add(IntToStr(ProcessInfo.cntUsage));
Node.SubItems.Add(IntToHex(ProcessInfo.th32DefaultHeapID,8));
Node.SubItems.Add(IntToHex(ProcessInfo.th32ModuleID,8));
Node.SubItems.Add(IntToStr(ProcessInfo.cntThreads));
Node.SubItems.Add(IntToHex(ProcessInfo.th32ParentProcessID,8));
Node.SubItems.Add(IntToStr(ProcessInfo.pcPriClassBase));
i := i+1;
end;
end;

//Kill Process
procedure TForm1.ToolButton2Click(Sender: TObject);
var
Handle : THandle;
begin
if MessageDlg('是否要结束进程?',mtWarning,[mbYes,mbNo],0)=mrYes then
begin
if ListView.Selected <> nil then
begin
Handle := OpenProcess(PROCESS_TERMINATE,False,ProcId[ListView.Selected.Index]);
TerminateProcess(Handle,0);
end;
end;
end;
kxy 2000-03-03
  • 打赏
  • 举报
回复
去看这里:)
http://www.midatech.com/csdn/expert/TopicView.asp?id=1104
kxy 2000-03-03
  • 打赏
  • 举报
回复
. PWS中的Inetinfo.exe为主调用程序,即Inetinfo.exe应该为HOST.
2. 参数用-e w3svc没有问题。
3. ——这可能是最重要的一点:你必须先将PWS和Inetinfo.exe从系统中移出去。如
果不这样,Delphi根本控制不到HOST!!!
4. 移除方法:修改注册表,将
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 和
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
中涉及到PWS和Inetinfo.exe的两个键值删去,再重启机器。这时,PWS和Inetinfo就已经不在系统中了。再启动Delphi,调试吧。 :)
olo 2000-03-03
  • 打赏
  • 举报
回复
那个Handle是CreateToolhelp32Snapshot返回的。
mytree 2000-03-03
  • 打赏
  • 举报
回复
BOOL WINAPI Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
BOOL WINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
都需要 HANDLE,而用GetModuleHandle也不能得到。
AcherMagic 2000-03-03
  • 打赏
  • 举报
回复
在delphi 5.0 中用Process32First
Process32Next,可以找到想找的进程
然后结束进程,但在 D3,D4中没有这样的API
AcherMagic 2000-03-03
  • 打赏
  • 举报
回复
KillProcess行不行

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧