DLL中有个函数装载一个文件,返回一个内存句柄,我每调用它一次,它吃文件大小那么多内存。我用完句柄后,却没办法释放它耗的内存,有办法解决么?

解决方案 »

  1.   

    你有句柄,你用什么函数分配的,调用对应的函数释放不就行了,如用VirtualAlloc分配的调用VirtualFree不就可以了。
      

  2.   

    一定要用FreeLibary()函数将分配的内存释放掉!
      

  3.   

    可以。只要你知道它是怎么分配的,调用相应的释放函数可以释放它。不过这样不是好办法,这可能会给程序造成麻烦。最好找作DLL的人,让他去自己解决。
      

  4.   

    在你的DLL中只调用一次不就行了。
      

  5.   

    我并不知道DLL中是如何分配内存的,而且也没有办法找到写此DLL的人。我本来要自己写这个DLL,发现他的DLL执行效率非常的高,我可能做不到,只可惜内存没有释放掉。我 还有什么办法么?
      

  6.   

    你在调用Dll时不能用静态装载,而只能用动态装载,才有可能被释放,即用loadlibrary函数来取得其Dll的句柄,然后用getprocaddress来得到所调用的函数的的位置指针,然后调用结束之后用freelibrary来释放即可:
    示例:
    声明过程
    type
    ...
    tcalledprocedure=procedure(var s:pchar);
    var
    ........procedrue tform1.button1click(sender:tobject);
    var
      mylib:thandle;
      s:pchar;
      p:tcalledprocedure;
    begin
    mylib:=loadlibrary('Name.dll');
    if mylib<>0 then 
    begin
    @p:=getprocaddress(mylib,'funcname');
    if@p<>nil then 
    begin
    p(s);
    edit1.text:=string(s);
    end;
    freelibrary(mylib);
    end;
    end;
    该程序从name.dll中调用函数funcname来取得一个字符串,并将其显示在edit1中,你可以试一下,不行了再通知我,OK?
      

  7.   

    在DllMain中的
    case DLL_PROCESS_ATTACH:中分配资源。
    case DLL_PROCESS_DETACH:中释放。