开发者社区> 技术小胖子> 正文

VB无所不能之一:指针

简介:
+关注继续查看
VB无所不能之一:指针
——作者:钟声
 
卷首语:
    无数次的见到有人一谈到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 Type VB数组
   数组维数
   数组大小
   真实的数组
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在这时候也就黯然失色了呢?
 




 本文转自 useway 51CTO博客,原文链接:http://blog.51cto.com/useway/174661,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
13953 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
33623 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18999 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
25240 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20697 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
13983 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
10019 0
21117
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载