Delphi 程序退出时删除自身


本文整理自网络,侵删。

 这样取得的地址实际上是这个封装代码的,而这段代码又处于 UnmapViewOfMap 解除映像范围类,因此,到调用 DeleteFile 函数的时候就无法反问到这段代码了。

解决的办法是,用GetProcAddress动态取得这几个API的地址。

Delphi&CB代码如下:

//////////////////////////////////////////////
procedure DeleteSelf;
var
pExitProcess: Pointer;
pDeleteFile: Pointer;
pUnmapViewOfFile: Pointer;
hModule: THANDLE;
cBuf:array[0..MAX_PATH]of Char;
begin
hModule := GetModuleHandle('kernel32');
if hModule <> 0 then
begin
pExitProcess := GetProcAddress(hModule, 'ExitProcess');
pDeleteFile := GetProcAddress(hModule, 'DeleteFileA');
pUnmapViewOfFile := GetProcAddress(hModule, 'UnmapViewOfFile');
end else
begin
pExitProcess := nil;
pDeleteFile := nil;
pUnmapViewOfFile := nil;
end;
hModule := GetModuleHandle(nil);
GetModuleFileName(hModule, cBuf, Sizeof(cBuf));
CloseHandle(THANDLE(4));
asm
XOR EAX, EAX;
PUSH EAX;
PUSH EAX;
LEA EAX, cBuf;
PUSH EAX;
MOV EAX, pExitProcess; PUSH EAX; MOV EAX, hModule; PUSH EAX; MOV EAX, pDeleteFile;
PUSH EAX;
MOV EAX, pUnmapViewOfFile;
PUSH EAX;
RET;
end;
end;
/////////////////////

相关阅读 >>

Delphi idhashmessagedigest 获取文件md5

Delphi 系统日期时间格式设置

Delphi-edit中只能输入数字且只能输入一个小数点

Delphi 5-7 桥接让Delphi xe2 datasnap中间层支持Delphi低版本开发客户端

Delphi httpclient async异步获取网页代码

Delphi xe7写的一个http post的小测试程序

Delphi 新增功能之: ioutils 单元(7): tfile 结构的功能

Delphi 动态创建窗体

Delphi跨平台tcp库的封装

Delphi获取进程和模块信息

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...