CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

急,有关调用DLL的内存释放问题

楼主xudoudou123(迷茫)2005-01-13 20:34:49 在 VB / 基础类 提问

用如下程序运行,每对一个文件处理内存就会增长1M,很快就会把内存吃完。怎么释放内存,请高手指点,看从哪里能改进.没有源代码,不改动DLL。  
  SPACE方法也使用了   无效。  
   
  DLL调用方式:(用了FreeLibrary   )  
  Private   Declare   Function   FreeLibrary   Lib   "kernel32"   (ByVal   hLibModule   As   Long)   As   Long  
  Private   Declare   Function   LoadLibrary   Lib   "kernel32"   Alias   "LoadLibraryA"   (ByVal   lpLibFileName   As   String)   As   Long  
  Private   Declare   Function   GetProcAddress   Lib   "kernel32"   (ByVal   hModule   As   Long,   ByVal   lpProcName   As   String)   As   Long  
  Private   Declare   Function   CallWindowProc   Lib   "user32"   Alias   "CallWindowProcA"   (ByVal   lpPrevWndFunc   As   Long,   ByVal   hWnd   As   Long,   ByVal   Msg   As   Any,   ByVal   wParam   As   Any,   ByVal   lParam   As   Any)   As   Long  
  Private   Declare   Function   GetModuleHandle   Lib   "kernel32"   Alias   "GetModuleHandleA"   (ByVal   lpModuleName   As   String)   As   Long  
  Private   Declare   Function   ImgAutoCorrectA   Lib   "ImagePro.dll"   Alias   "ImgAutoCorrect"   (ByVal   strFilePath   As   String)   As   Long  
  Private   Declare   Function   CloseImgFileA   Lib   "ImagePro.dll"   Alias   "CloseImgFile"   ()   As   Long  
   
  递归调用:  
  Private   Function   IMGpath(ByVal   sPath   As   String)   As   Boolean  
   
   
          On   Error   GoTo   ErrorHandle  
          Dim   nRet   As   Long  
          IMGpath   =   False  
          Dim   fullPath   As   String  
          DoEvents  
          If   Right(sPath,   1)   <>   "\"   Then  
                  sPath   =   sPath   +   "\"  
          End   If  
          '开始操作该目录下的所有文件  
          Dim   sName   As   String  
          sName   =   Dir(sPath)  
          Do   While   sName   <>   ""  
                  If   sName   <>   "."   And   sName   <>   ".."   Then  
                          If   Right(sName,   3)   =   "tif"   Then  
                                  fullPath   =   sPath   +   sName  
                                  Dim   lb   As   Long  
                                  lb   =   LoadLibrary(App.Path   &   "\ImagePro.dll")  
  '                                 test   =   GetModuleHandle(App.Path   &   "\ImagePro.dll")  
  '                                 MsgBox   test  
  '--------------------确认问题出在这两句  
                                  nRet   =   ImgAutoCorrectA(fullPath)  
                                  Call   CloseImgFileA  
                                  FreeLibrary   lb  
  '---------------------确认问题出在这两句  
                                  Acount   =   Acount   +   1  
                                  Label1.Caption   =   Acount  
  '                                 Sleep   (100)  
                          End   If  
                  End   If  
                  sName   =   Dir  
                  '用户按下停止按钮,则退出  
                  If   msStatus   =   "msStop"   Then  
                          Label2   =   "处理取消"  
                          Exit   Function  
                  End   If  
          Loop  
          '循环所有的子目录  
  '         If   bAllSubdir   =   True   Then  
                  '1.     先取所的子目录  
                  Dim   sAllSubdir()   As   String  
                  Dim   nCount   As   Integer  
                  nCount   =   0  
                  sName   =   Dir(sPath,   vbDirectory)  
                  Do   While   sName   <>   ""  
                           
                          If   sName   <>   "."   And   sName   <>   ".."   Then  
                                  If   (GetAttr(sPath   &   sName)   And   vbDirectory)   =   vbDirectory   Then  
                                          'Debug.Print   sPath   &   sName  
                                          nCount   =   nCount   +   1  
                                          ReDim   Preserve   sAllSubdir(1   To   nCount)  
                                          sAllSubdir(nCount)   =   sName  
                                  End   If  
                          End   If  
                            '用户按下停止按钮,则退出  
                                  If   msStatus   =   "msStop"   Then  
                                          Erase   sAllSubdir  
                                          Label2   =   "处理取消"  
                                          GoTo   ExitHandle  
                                  End   If  
                          sName   =   Dir  
                  Loop  
                  '2.   对所有的子目录下的文件操作  
                  If   nCount   >   0   Then  
                          Dim   n   As   Integer  
                          For   n   =   1   To   nCount  
                                  If   IMGpath(sPath   &   sAllSubdir(n))   =   False   Then  
                                          Erase   sAllSubdir  
                                          GoTo   ExitHandle  
                                  End   If  
                                    '用户按下停止按钮,则退出  
                                  If   msStatus   =   "msStop"   Then  
                                          Erase   sAllSubdir  
                                          Label2   =   "处理取消"  
                                          GoTo   ExitHandle  
                                  End   If  
                          Next   n  
                  End   If  
                  Erase   sAllSubdir  
  '         End   If  
          IMGpath   =   True  
          GoTo   ExitHandle  
  ErrorHandle:  
  MsgBox   Err.Description  
  ExitHandle:  
  Call   refresh  
   
  End   Function  
  问题点数:50、回复次数:9Top

1 楼ezlj(我啊)回复于 2005-01-13 22:33:49 得分 0

帮你顶Top

2 楼xudoudou123(迷茫)回复于 2005-01-14 08:57:45 得分 0

来个高手帮我看看啊Top

3 楼xudoudou123(迷茫)回复于 2005-01-14 08:58:39 得分 0

说明:ImgAutoCorrectA(fullPath)     是对图象进行处理的     图象本身只有40K  
  Top

4 楼xudoudou123(迷茫)回复于 2005-01-15 00:23:59 得分 0

拜~~~~~~~~~~~~~~Top

5 楼daisy8675(莫依 沉迷)回复于 2005-01-15 00:34:50 得分 10

递归算法本身效率不高,你的内存不被吃完才怪,不看你那代码了,脑袋晕,建议你换个算法  
   
  图象处理可以参考zyl910的文章Top

6 楼viena(维也纳N02)回复于 2005-01-15 00:55:24 得分 0

同意楼上老大的说法~Top

7 楼xudoudou123(迷茫)回复于 2005-01-17 13:42:20 得分 0

已经测试   和递归无关Top

8 楼jadeluo(秀峰)回复于 2005-01-17 16:13:05 得分 20

不太明白你为什么要lb   =   LoadLibrary(App.Path   &   "\ImagePro.dll"),   这个LoadLibrary的结果在后面的语句中根本没有加以利用啊?  
  你的程序根本就没有用到动态加载DLL的技术,所以不需要什么LoadLibrary和FreeLibrary的API调用。Top

9 楼of123()回复于 2005-01-17 16:42:55 得分 20

不需要   LoadLibrary,尤其不可在循环中反复   LoadLibrary。  
   
  在模块中声明   DLL   函数即可。Top

相关问题

  • dll中申请的内存是否不能由调用它的exe释放?
  • 用办法么:一个DLL没有释放内存,我在调用它的程序中能释放它占用的内存么?
  • VB.NET调用正规DLL,内存出错
  • dll调用dll的FreeLibrary释放问题
  • 我每次调用DLL时,是这样做的,但是我感觉调用完成后内存没有全部释放,太浪费资源了
  • 如何释放调用api函数是占有的内存?
  • dll中调用dll,内存狂涨的问题!
  • Delphi调用C的DLL库,部分内存被改写。谢谢。
  • DLL调用内存泄漏问题--是Window的bug吗
  • 结束线程的时候需要调用free释放内存吗?

关键词

  • 内存
  • 文件
  • sallsubdir
  • sname
  • longprivate
  • spath
  • imagepro
  • 调用
  • ncount
  • imgautocorrecta

得分解答快速导航

  • 帖主:xudoudou123
  • daisy8675
  • jadeluo
  • of123

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo