比如智能ABC,智能ABC的输入法文件WINABC.IME,在系统启动时并没有被调用,能对该文件进行删除,改名等操作,在切换到智能ABC输入法后系统就调用了这个文件,之后在切换回英文输入法系统扔没有释放该文件,也就没法对该文件做任何操作了,请问有办法释放该文件吗?(注销系统也能释放该文件)
解决方案 »
- 为什么我通过TStringList.LoadFromFile加载文件内容到StringList中后就变成乱码了呢?
- 局域网上音频文件录音、播放同步的问题, 在线等,跟贴与UP者有分
- 远程操作数据库,偶尔提示‘某某’字段无法找到!
- 哪里有注册的fastreport V2.53下载?
- 100分,求救!!!
- 对treeview进行结点复制?
- 我正看scanline,你帮我一下吧
- onterminate := form1.Threaddone;之后线程就不能自动析构了?我程序3分钟就占用2G内存
- 大家能否帮我分析一份协议
- delphi7如何实现图片循环展示
- 我从TEdit派生出的TNumEdit,在控件栏上无法显示。
- 请问怎样用鼠标拖动一个 控件 在窗体中移动 ????????????急!!!!!!
看看吧希望对你有帮助程序删除自身(Delphi版)
www.codesky.net 2004-10-10 自由网络
关键字:
program Project1; uses Windows; procedure DeleteSelf; var hModule: THandle; buff: array[0..255] of Char; hKernel32: THandle; pExitProcess, pDeleteFileA, pUnmapViewOfFile: Pointer; begin hModule := GetModuleHandle(nil); GetModuleFileName(hModule, buff, sizeof(buff)); CloseHandle(THandle(4)); hKernel32 := GetModuleHandle('KERNEL32'); pExitProcess := GetProcAddress(hKernel32, 'ExitProcess'); pDeleteFileA := GetProcAddress(hKernel32, 'DeleteFileA'); pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile'); asm LEA EAX, buff PUSH 0 PUSH 0 PUSH EAX PUSH pExitProcess PUSH hModule PUSH pDeleteFileA PUSH pUnmapViewOfFile RET end; end; begin DeleteSelf; end.
现在有一点比较古怪,那就是必须把代码放在一个Procedure里,直接放在begin ... end.中间是不行的。也许是全局变量不能使用的缘故,但为什么不能使用,还是不是很清楚。
还有,不GetProcAddress,直接如下写:
PUSH OFFSET UnmapViewOfFile
trace的结果是执行进入了KERNEL32.UnmapViewOfFile的,只是在函数内RET $4出就出错了,跳到了一个莫名其妙的地方。为什么会这样?难道是Delphi的编译器的问题吗?
另外,Borland论坛上RE的代码不是上面的,不过效果跟我写的一样。但是FreeLibrary(p)跟UnmapViewOfFile(hModule)效果一样吗? 代码如下:
program Project1; uses windows; procedure DeleteSelf; var module : HMODULE; buf : array [ 0 .. MAX_PATH - 1 ] of char; p : ULONG; hKrnl32 : HMODULE; pExitProcess, pDeleteFile, pFreeLibrary : pointer; begin module := GetModuleHandle ( nil ); GetModuleFileName ( module, buf, sizeof ( buf ) ); CloseHandle ( THandle ( 4 ) ); p := ULONG ( module ) + 1; //上面这一句什么意思?
hKrnl32 := GetModuleHandle ( 'kernel32' ); pExitProcess := GetProcAddress ( hKrnl32, 'ExitProcess' ); pDeleteFile := GetProcAddress ( hKrnl32, 'DeleteFileA' ); pFreeLibrary := GetProcAddress ( hKrnl32, 'FreeLibrary' ); asm lea eax, buf push 0 push 0 push eax push pExitProcess push p push pDeleteFile push pFreeLibrary ret end; end;