易截截图软件、单文件、免安装、纯绿色、仅160KB

vb在调用API的一个Bug可能导致内存泄露

其实这个问题我很早很早以前就发现了,只是一直没留意,也不在意。今天无意中又用VB写了一个程序全部使用NTDLL导出函数编写,又出现了这样的情况,这样就由不得我不注意了,经过我的反复测试以及反汇编验证,证实了vb6_sp6在调用某些API(测试的应该有很多API存在这样的问题)存在内存泄露问题或者是函数调用失败。请大家先看我写的简单两段代码。
代码一:
Option Explicit
Private Const MEM_RELEASE = &H8000
Private Const MEM_COMMIT = &H1000
Private Const PAGE_EXECUTE_READWRITE = &H40
Private Declare Function VirtualAlloc Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFree Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
Private Sub Code1()
    Dim Base As Long
    Base = VirtualAlloc(ByVal 0&, 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
    If Base Then
        MsgBox Hex(Base)
        MsgBox VirtualFree(ByVal Base, 0, MEM_RELEASE)
        MsgBox Hex(GetLastError)
    End If
End Sub
这段代码是申请一段内存,然后马上释放它,代码没什么难以理解的非常简单。大家仔细看代码上好像也不存在有什么问题,那么问题在什么地方呢?
我一句一句来解析首先“Base = VirtualAlloc(ByVal 0&, 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE)”
这行代码申请了一段长100字节的内存跟踪结果成功申请了得出某地址,然后我用msgbox把地址显示出来
这时这段地址是可用的,大家可以使用一些内存察看编辑工具,比如冰刃之类的。然后调用“VirtualFree ByVal Base, 0, MEM_RELEASE"释放内存,失败了。我检查了很久参数和API声明均没发现有什么问题那么问题出在什么地方呢?为了求证我写了代码二,也就是代码一最终在Ring3层调用的API函数
代码二:
Option Explicit
Private Const MEM_RELEASE = &H8000
Private Const MEM_COMMIT = &H1000
Private Const PAGE_EXECUTE_READWRITE = &H40
Private Declare Function Vi


相关文档:

“自动点击按钮”小工具VB源码

“自动点击按钮”小工具VB源码
Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Pri ......

重拾VB之三,二进制文件篇

重拾VB之三,二进制文件篇
PMP 关劲松
     鬼使神差,09年12月入职的公司仍使用VB开发软件,虽然并非专职开发,但也不得不在事隔4年之后,重新使用VB。
读取、修改二进制文件仍是大部分编程语言的基本开发技能。可以提高处理文件效率,主要应用在通信、交换数据等方面。
'open   filena ......

如何用VB实现Excel文件的自动合并

简单而实用的合并Excel文件的函数,能够将多个XLS文件中指定数量的工作表自动合并到一个XLS文件里。当然,如果只是数据合并,则使用ADO就可以实现,但如果要保留表格格式,则恐怕只能使用俺的方法了。
    一、函数代码:
Option Explicit
'* ********************************************************* ......

vb 连接oracle数据库

         
    Dim cn As ADODB.Connection
    Dim rs     As ADODB.Recordset
    Set cn = New ADODB.Connection
    cn.Open "Provider=OraOLEDB.Oracle.1;Persist Security Info= ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号