我是这么判断的比如这个DLL是  1.dllRewrite创建1.dll如果创建失败,则这个DLL正在运行...如果创建成功,则DLL没有运行,那么DLL也变成0KB了,我之前复制到别的文件夹备份,然后恢复但是觉得这个方法太2了.有没有好的方法?遍历就算了...效率慢不老方便,或者给个效率快的代码看看?

解决方案 »

  1.   

    ......var DllHandle:THandle=0;
        s:string;......
    begin
      if DllHandle = 0 then begin
        s:='myDLL.dll';
        DllHandle:= LoadLibrary(PChar(s));
      end;
    ......
      

  2.   

    楼主的办法可行的,也可以用deletefile删除它,删除不成功表示已经加载了或者LoadLibrary动态加载,用一个全局变量保存THandle,判断Handle是否为0
      

  3.   

    if  GetModuleHandle('xxxx.dll') > 0 then 
      模块加载  else  模块未加载;
      

  4.   

    1楼4楼可能没明白我的意思,这个DLL不是我的,也不是我来加载,我只是要看这个DLL有没有被人加载.
      

  5.   

    别的EXE加载了1.dll  我用GetModuleHandle有什么用?这个1.DLL我不加载,也不调用,跟我没任何关系,我就想知道别的程序有没有加载1.DLL而已.
      

  6.   

    搜整个内存 特征码。。
    或者遍历 所有进程的dll..
      

  7.   

    看来没办法了...
    求个遍历所有进程DLL代码,看进程DLL里有没有c:\1.DLL
      

  8.   

    独占写方式打开这个DLL,如果能打开,没加载,否则....
      

  9.   

    //伪代码   hProcess = OpenProcess( PROCESS_QUERY_INFORMATION or
                                PROCESS_VM_READ,
                                FALSE, processID );
       ...   //获取进程中所有模块
       EnumProcessModules(hProcess, hMods, sizeof(hMods), @cbNeeded))
       for ... do
       begin
         ...     if ( GetModuleFileNameEx( hProcess, hMods[i], szModName,
                                          sizeof(szModName) / sizeof(CHAR))) then
           //to do:你的代码
       end;
        
        // 释放句柄,解除引用
        CloseHandle( hProcess );
      

  10.   

    用 改变 1.dll 文件名的方式~ 不能改就是在用... 能改就再改回来...
      

  11.   

    可以通过遍历进程的方式查看其使用的dll,速度应该挺快的