VB无所不能之一:指针

VB无所不能之一:指针,第1张

概述本文地址: http://blog.csdn.net/useway 《Java程序员,上班那点事儿》 ——作者:钟声 卷首语:     无数次的见到有人一谈到VB都会显露出不屑的神情。     VB一个软件开发领域的老朋友,它曾经以开发便捷与简单著称,它在一定时间内成为一个非常常用的开发语言。     然而,当很多人享受这VB带来的便捷的同时,还在嘲讽这个VB,总是用VC的种种所谓的优势来和VB对 本文地址: http://blog.csdn.net/useway《Java程序员,上班那点事儿》 ——作者:钟声 卷首语: 无数次的见到有人一谈到VB都会显露出不屑的神情。 VB一个软件开发领域的老朋友,它曾经以开发便捷与简单著称,它在一定时间内成为一个非常常用的开发语言。 然而,当很多人享受这VB带来的便捷的同时,还在嘲讽这个VB,总是用VC的种种所谓的优势来和VB对比。让我想起了今天的Java,当那些享受着Java带来的轻松的人,却还在用C/C++嘲讽着Java是一样的。 VB它的优势岂能由VC企及,不说别的,只说VB的开发速度VC基本上是望尘莫及的。传统上,VC相对与VB而言有很多的优势: 1、指针:这个似乎是打击所有没有指针的语言(如:java)的利器。 2、原始IP包的获取:用混杂模式获取IP数据报信息,C++中称为原始IP包。 3、系统消息钩子:用钩子程序获取windows系统消息。 4、利用静态链接实现软件的绿化:同时也便于生成一个病毒或者木马程序。 5、和硬件相关的开发,如显示器、声卡、网卡等。 本系列连载,将针对上述5个问题来讨论,VB实现的可能性。 一、为什么VB要用指针: C/C++中都可以 *** 作指针,用指针可以很方便的访问到内存区域,C++中的指针其实就是数组的一个访问方式而已,由于其使用比较方便,可以非常方便的进行对内存区域的赋值与读取 *** 作,因此,用惯了C++的程序员乐此不疲。 其实,我们在用VB开发一般程序的时候是没有必要用指针去访问内存某区域的。因为VB为我们提供了一个非常方便的访问方法——就是VB的数组。用数组可以很方便的使用一组数据。然而,为什么,在VB中我们非要去实现指针的 *** 作呢? 1、数据 *** 作速度的需求 比如,需要针对两个数组之间的复制 *** 作,需要给数组做一个循环,然后在逐个的添加到新的数组中,用指针的方法速度会快很多。 2、在对系统库函数的调用时 windows中的User32.dll/GDI32.dll/Kernel32.dll等这些系统库函数中,很多都是接收指针参数的,因此,如果VB需要调用这些函数的时候,就必须要进行指针的传参。 二、VB怎么用指针 要想弄明白VB怎么使用指针,就必须要弄明白两件事,第一,如何取得数组的指针,第二,如何将指针所指向的数组取出来。 A、在讲解这两个问题之前,我们需要了解几个问题: 1、VB的数组与C++的数组的区别 有可能,大家现在认为VB的数组和C++的数组没有任何区别,都是内存中的一段地址而已,其实不然。 C++中是真的数组,真的是一段地址,而且,当你的指针访问超出了数组的范围,也没人理你,只是很容易导致系统崩溃而已。 而VB数组其实是一个结构体,在这个结构体中包含了关于这个数组的描述信息,其结构类似如下: Private TypeVB数组 数组维数 数组大小
真实的数组
End Type 2、copymemory系统函数 这个函数有点像Java中的Arraycopy函数,就是将两段内存空间进行复制 *** 作。它的声明是这样的: Public Declare Sub copyMemory lib "kernel32" Alias "RtlMoveMemory" (Destination As Any,Source As Any,ByVal Length As Long) 函数原型
VOID copyMemory(
PVOID Destination,
CONST VOID *Source,
DWORD Length
); 第一个参数:目的地址指针 第二个参数:源地址指针 第三个参数:复制的大小 请注意,在copyMemory的VB声明中,传递的源与目的是Any类型,也就是说可以是任何类型的变量。 B、如何用指针 1、如何取得数组的指针 请看如下程序: pOutputArray As Long
outputArray() As Byte ReDim outputArray(100) As Byte
pOutputArray = VarPtr(outputArray(0)) 说明: 我们声明了一个Byte数组outputArray,用VarPtr函数,取出数组的指针赋给了Long型变量pOutputArray。 2、如何将指针所指向的数组取出来 请看如下程序: copyMemory ByVal pOutputArray,ByVal pData,UBound(outputArray) 说明: pData是一个内存块的指针,通过这句话的执行,我们得到了pData指向的内存区域中的数据到pOutputArray数组中。 三、高级应用:取得函数的指针 有时候,系统函数库调用中会要求有回调函数,而将回调函数以参数进行传递时,并不能传入回调函数名,而是需要将回调函数的地址传参,这时候,我们就需要得到回调函数的地址。 在这里我只给出例子代码,有兴趣的朋友可以去研究。 Public Sub RegisterWinProc(ByVal hwnd As Long) '传入hWnd是本窗口的句柄
'getwindowlong从指定窗口的结构中取得信息
prevWndProc = getwindowlong(hwnd,GWL_WNDPROC)
'SetwindowLong在窗口结构中为指定的窗口设置信息
SetwindowLong hwnd,GWL_WNDPROC,AddressOf WndProc
DesthWnd = hwnd
End Sub 四、结束语 大家看,VB在处理指针的时候,只要掌握了相应的方法,是不是VC在这时候也就黯然失色了呢? 钟声 2009-7-6
原文链接: http://www.jb51.cc/article/p-tonywgia-qm.html 总结

以上是内存溢出为你收集整理的VB无所不能之一:指针全部内容,希望文章能够帮你解决VB无所不能之一:指针所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1286831.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存