比如智能ABC,智能ABC的输入法文件WINABC.IME,在系统启动时并没有被调用,能对该文件进行删除,改名等操作,在切换到智能ABC输入法后系统就调用了这个文件,之后在切换回英文输入法系统扔没有释放该文件,也就没法对该文件做任何操作了,请问有办法释放该文件吗?(注销系统也能释放该文件)

解决方案 »

  1.   

    跟这个原理不知道是不是一样..呵呵
    看看吧希望对你有帮助程序删除自身(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; 
      

  2.   

    很简单,因为它是DLL,被Load了还怎么删?