急,有关调用DLL的内存释放问题
用如下程序运行,每对一个文件处理内存就会增长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




