巧用Win32 API函数增强VB位操作功能

合集下载

谈谈Windows API 在VB 中的应用

谈谈Windows API 在VB 中的应用

[摘 要] 本文首先讲述在VB中运用Windows API的一般方法,然后结合本人编程经验从界面编程、多媒体编程、系统编程等方面举例讲述API的实际应用,最后讲述VB中API应用应注意的问题以及解决办法。

Windows API(应用程序接口)是Windows 视窗系统提供给用户进行系统编程和外设控制的强大的应用程序接口,灵活运用好Windows API将使用户的程序更专业,功能更强大。

本文将从VB中API运用的一般方法、编程应用和应注意的问题及解决办法等三个方面讲述在VB中API的应用问题。

一、 VB中运用Windows API 的一般方法Windows API提供给用户成千上万个系统功能调用的函数,功能十分强大,灵活有效运用它,能使用户实际中遇到的许多棘手问题迎刃而解。

VB中没有提供直接调用API的功能,但VB中能通过声明API函数,从而有效使用API。

下面是关于VB中使用API的一般方法:1. 首先利用VB提供的API 浏览器查找到所需声明的API函数和常量定义,并复制该函数。

(注:若用户无API浏览器,也可以从\VB\WINAPI\Winapi32.txt中直接复制所需API函数。

)2. 然后在VB中新增一个模块,并将前面复制的API函数和常量定义复制到模块中。

3. 最后在VB程序中就可以象VB自身的函数一样运用API函数。

二、VB中Windows API的编程应用1.界面编程1)示例一:创建不规则窗体Win32 API 有很多让你意想不到的功能。

要创建特殊的不规则窗口看上去似乎很难。

但我们运用API,则几行代码就可以实现,这似乎不可思议。

但事实就是如此,不信看看吧!实现步骤:(1 ) 建立一个新项目文件DEMO1.PRJ;(2 ) 建立模块文件DEMO1.BAS.并在模块的声明部分加入以下代码:Private Declare Function CreatePolygonRgn Lib "gdi32"(lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As LongPrivate Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long'定义顶点结构Public Type POINTAPIX As LongY As LongEnd TypePublic Dim XYPOINT() As POINTAPI(3)在窗体Form1的Command1_Click处理程序中加入以下代码: Private Sub Command1_Click()'定义区域句柄Dim hRgn As LongDim lRes As Long'定义T型顶点坐标数组ReDim XYPOINT(7) As POINTAPI 'T shape has 8 points'确定T型顶点坐标的值With MeXYPOINT(0).X = 0XYPOINT(0).Y = 0XYPOINT(1).X = .ScaleWidthXYPOINT(1).Y = 0XYPOINT(2).X = .ScaleWidthXYPOINT(2).Y = .ScaleHeight / 2XYPOINT(3).X = .ScaleWidth - (.ScaleWidth / 3) XYPOINT(3).Y = .ScaleHeight / 2XYPOINT(4).X = .ScaleWidth - (.ScaleWidth / 3) XYPOINT(4).Y = .ScaleHeightXYPOINT(5).X = .ScaleWidth / 3XYPOINT(5).Y = .ScaleHeightXYPOINT(6).X = .ScaleWidth / 3XYPOINT(6).Y = .ScaleHeight / 2XYPOINT(7).X = 0XYPOINT(7).Y = .ScaleHeight / 2End WithhRgn = CreatePolygonRgn(XYPOINT(0), 8, 1) lRes = SetWindowRgn(Me.hWnd, hRgn, True) Me.BackColor = vbBlueEnd Sub(4)在窗体的Form_Unload处理程序中加入代码:Private Sub Form1_DbClick()Unload MeEnd Sub运行效果如下图:2)示例二:游动的窗体朋友,您使用过Linux吗?如果您使用过的话,那么Linux中那只游动的可爱小企鹅,一定忘不了。

Win32API函数大全使用详解

Win32API函数大全使用详解

一、窗口函数(Window)= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == =AdjustWindowRect函数功能:该函数依据所需客户矩形的大小,计算需要的窗日矩形的大小。

计算出的窗口矩形随后可以传递给CreateWindow函数,用于创建一个客户区所需大小的窗口。

函数原型:BOOL AdjustWindowRect(LPRECT lpRect ,DWORDdwStyle,BOOL bMENU);参数:lpRect:指向RECT结构的指针,该结构包含所需客户区域的左上角和右下角的坐标。

函数返回时,该结构容纳所需客户区域的窗口的左上角和右下角的坐标。

dwStyle:指定将被计算尺寸的窗口的窗口风格。

bMenu:指示窗口是否有菜单。

返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。

获取错误信息,参看GetLastError。

备注:客户矩形是指完全包含一个客户区域的最小矩形;窗日矩形是指完全包含一个窗口的最小矩形,该窗口包含客户区与非客户区。

当一个菜单条下拉出两行或更多行时,AdjustWindowRect函数不增加额外的空间。

速查:Windows NT:3.1以上版本:Windows:95以上版本:Windows CE:不支持;头文件:winuser.h;库文件:user32.lib。

= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = = = = = = = = = = = = = = = = = = = = = = = = = = = = =AdjustWindowRectEX函数功能:该函数依据所需客户矩形大小,计算需要的窗口矩形的大小。

Windows_API函数大全及应用方法

Windows_API函数大全及应用方法

Windows_API函数大全及应用方法Windows API函数我们知道VB可以做很多事,但是有些事情,特别是涉及对Windows操作系统的访问,还需要借助Win32 API函数(Microsoft Win32 Application Programming Interface的缩写)。

API 函数是一组用C语言编写的函数,总共约有一千来个。

原本是为C语言编程人员而编写的,但也可以在VB应用程序中调用。

按功能划分,Win32 API函数大致涉及以下几个方面:窗口管理、图形设备接口、系统管理和多媒体技术。

Win32 API函数以动态链接库DLL提供给用户,可以在任何语言中调用。

DLL在程序运行时装入,随时响应程序的调用,不必在设计时就将文件存放在工程中,这就是动态链接的意思。

正因为如此,一个DLL程序可以同时为多个程序所调用。

在VB中引用API函数,需要事先通过Declare函数,声明要引用的DLL文件名称以及相应函数的参量。

然后便可像使用VB函数一样使用API函数。

我们看以下类似的声明语句:Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As LongGetComputerName是API函数名,kernel32是库名。

括号中的ByVal lpBuffer As String, nSize As Long就是函数的参量。

最后面的Long表示函数返回值的数据类型。

本节通过例子说明Win32 API 函数的应用。

Windows在创建每个窗体时,都会赋给它一个与众不同的编号,这就是窗体的句柄。

在Windows中,窗体与控件都被看成是窗体(窗口)。

窗体的句柄保存在自己的hwnd属性中。

32位Windows API在VB6中实现串行通信的技术分析

32位Windows API在VB6中实现串行通信的技术分析
P C硬 件 资 源 , 不 必 依 赖 于 MS D0S和 W i9 系 而 — n8
AP I是 附 带 在 W i9 n 8内 部 的 一 个 极 其 重 要 的 组 成 部 分 。 W i9 n 8的 3 2位 API主 要 是 一 系 列 很 复
杂 的 函 数 、 息 的 集 合 。 它 可 以 看 作 是 Wi9 消 n 8系 统
【 关键词】 A I串行通信; B P; V6
Te h ia a y i n 3 一 i W i d wsAPIt c nc l An lsso 2 b t no o
Re l e S —a mmu i to n VB6 a i e lCo z nc in i a
AP 接 口是 对 VB功 能 的 最 重 要 的 扩 充 。 几 乎 I
统 服 务 。 可 以 说 , 是 借 助 于 AP 正 I使 得 VB既 能 隐 藏 大 部 分 Wi d ws编 程 的 难 点 , 时 又 提 供 了 使 用 no 同
Wid ws 境 的 灵 活 性 。 no 环
维普资讯 http:/Байду номын сангаас
第6 卷第 3 期 20 年 9 06 月
河北职 业技术学院学报
J OURNAL OF HEB EIPOLYT ECHNI C COL LEGE
3 Wi sA 在 VB 中 2位 o I n w P d 6
因 而 在 串 行 通 信 中 使 用 调 用 API接 口 的 方 法 是 实 现 在 VB中 直 接 控 制 串 行 口硬 件 的 简 便 可 行 的
【 e od 】 A I sr mmu i t n VB K yw rs P; i c e ao l n i; 6 a c o [ 中图分类号]T 3 6 P 1 [ 文献标识码 ]A [ 文章编号]17 —1 1 (O 6 0 —0 1 —0 6 1 07 2o )3 0 9 2

在VB中使用API函数(之一)VB-电脑资料

在VB中使用API函数(之一)VB-电脑资料

在VB中使用API函数(之一)VB-电脑资料在VB 中使用API函数(之一) 什么是API? API(Advanced Programmers Interface,高级程序员接口)(注:API实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制 Windows 的各个部件(从桌面在VB中使用API函数 (之一)什么是API?API(Advanced Programmers Interface,高级程序员接口)(注:API 实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么.这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法.这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数.同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...).API 声明正如在"什么是API"中所说,API函数包含在位于系统目录下的DLL 文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer.要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择"声明",找到所需函数,点击"添加(Add)"并"复制(Copy)",然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法.你将会遇到一些问题:假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的Public 成员...看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如Private Declare Function...).--不要忘了,可是这将使该函数只在该窗体模块可用.在有些情况下,你会得到"不明确的名称"这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行.你可以通过查看VB的Declare语句帮助主题来获取有关Alias的详细说明.消息(Messages)好了,现在你已经知道什么是API函数了,但你也一定听说过消息(如果你还没有,你很快就会)并且想知道它是什么.消息是Windows告诉你的程序发生了哪些事件或要求执行特定操作的基本方法.例如,当用户点击一个按钮,移动鼠标,或是向文本框中键入文字时,一条消息就会被发送给你的窗体.所有发送的消息都有四个参数--一个窗口句柄(hwnd),一个消息编号(msg)还有两个32位长度(Long)的参数.hwnd即要接受消息的一个窗口的句柄,msg即消息的标识符(编号).该标识符是指引发消息的动作类型(如移动鼠标),另外两个参数是该消息的附加参数(例如当鼠标移动时光标的当前位置)但是,当消息发送给你时你为什么看不到呢--就象有人在偷你的信一样?请先别恼火,让我告诉你.小偷其实是Visual Basic.但它并没有偷走你的信,而是在阅读了之后挑出重要的以一种好的方式告诉你.这种方式就是你代码中的事件(Event).这样,当用户在你的窗体上移动鼠标时,Windows会发送一条WM_MOUSEMOVE消息给你的窗口,VB得到这条消息以及它的参数并运行你在事件MouseMove中的代码,同时VB会把这条消息的第二个32位数(它包含了x,y坐标,单位为像素(Pixel),每个位16位)转换为两个单精度数,单位为缇(Twip).现在,如果你需要光标坐标的像素表示,然而VB已经把它转换成了缇,因此你需要重新把它转换为以像素为单位.在这里,Windows给了你所需要的,但VB"好意地"进行了转换而使你不得不重新转换.你可能会问--我难道不能自己接收消息吗?答案是肯定的,你可以使用一种叫做子类处理(Subclass)的方法.但你除非必须否则最好不要使用,因为这与VB 的安全程序设计有一点点的违背.(注:子类处理确实有很大的风险,但如果使用得当,是很有用处的.不过有一点一定要注意,即千万不要使用VB 的断点调试功能,这可能会导致VB崩溃!)需要补充说明的是:你可以发送消息给你自己的窗口或其他的窗口,只需调用SendMessage或PostMessage(SendMessage会使接受到消息的窗口立刻处理消息,而PostMessage是把消息发送到一个称为消息队列的队列中去,等候处理(它将会在该消息处理完后返回,例如有些延迟)).你必须制定接受消息的窗口的句柄,欲发送消息的编号(所有的消息的编号均为常量,你可以通过API Text Viewer查得)以及两个32位的参数.。

利用API 增强VB 的图像处理功能

利用API 增强VB 的图像处理功能

利用API 增强VB 的图像处理功能The Method of Enhancing Ability of VB's Image Processing Using API马 靖 陈江林 摘要:本文介绍了应用API 函数增强Visual Basic 的图像处理功能的方法。

用API 直接对显示缓存操作的函数进行图像处理,扩展了VB 的图像处理功能,提高了程序的执行效率。

利用API 函数,对曝光不足和过度的胸部X 影像进行灰度拉伸增强处理,获得了满意的效果。

关键词:API 函数 图像处理 函数声明 对比度扩展中图分类号:TP311 文献标识码:AAbstract: This paper introduces a method of the e nhancing ability of VB's image processing using API. It expanded the competency of image processing and raised the efficiency of executive program by operating the functions display buffer oriented during image processing. The satisfactory purpose is gained through contrast stretching referring to underexposured and upperexposured X-ray image about bosom .Keywords : API functions Image processing Function declaration Contrast stretch 1 引言Windows 应用程序接口API (Application Programming Interface )是可视化编程工具的扩展和延伸,特别对于Visual Basic 尤为重要,Visual Basic 具有易学易用、功能强、见效快等突出特点,但VB 程序执行效率低,特别对于数据庞大的图像处理显得尤为突出。

史上最强---win32API函数大全文档

史上最强---win32API函数大全文档

史上最强---win32API函数大全文档Win32 API函数大全1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接WNetEnumResource 枚举网络资源WNetGetConnection 获取本地或已连接的一个资源的网络名称WNetGetLastError 获取网络错误的扩展错误信息WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称WNetGetUser 获取一个网络资源用以连接的名字WNetOpenEnum 启动对网络资源进行枚举的过程2. API之消息函数BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置GetMessageTime 取得消息队列中上一条消息处理完毕时的时间PostMessage 将一条消息投递到指定窗口的消息队列PostThreadMessage 将一条消息投递给应用程序RegisterWindowMessage 获取分配给一个字串标识符的消息编号ReplyMessage 答复一个消息SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口SendMessageCallback 将一条消息发给窗口SendMessageTimeout 向窗口发送一条消息SendNotifyMessage 向窗口发送一条消息3. API之文件处理函数CloseHandle 关闭一个内核对象。

在VB中使用API函数(之二)VB-电脑资料

在VB中使用API函数(之二)VB-电脑资料

在VB中使用API函数(之二)VB-电脑资料在VB中使用API函数(之二) Windows的一些特别之处这个主题是要告诉你Windows 的一些与在VB中的不同的细节 Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用在VB中使用API函数 (之二)Windows的一些特别之处这个主题是要告诉你Windows 的一些与在VB中的不同的细节Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都提供了Hwnd属性来表示其句柄.Windows 使用像素(Pixel)而不是缇(Twip).因此,把涉及API函数调用的控件的ScaleMode属性设为3--(Pixel)是个不错的主意,这样你可以通过ScaleXXX属性得到它们的公制单位值.尽管这样,你可能有时仍需要进行从Twip到Pixel的转换(反之亦然),你可以通过Screen对象的TwipsPerPixelX和TwipsPerPixelY来实现.举例如下:PixelXValue=TwipXValueScreen.TwipsPerPixelXPixelYValue=TwipYValueScreen.TwipsPerPixelYTwipXValue=PixelXValue*Screen.TwipsPerPixelXTwipYValue=PixelYValue*Screen.TwipsPerPixelY我并没有在实际中见到过TwipsPerPixelX 和TwipsPerPixelY 的值有什么不同,但你最好是把它们区别开来而不是混用,这至少是一种好的程序设计风格.另外需要注意的是,这里用的是" "(整除) 而不是 " / " ,这是因为像素值必须是整数.另外需要提到的是,Windows函数中用到了不同的坐标系统,因此需要注意.最后要注意的是,一旦你使用了API 函数,VB就可能不再可靠了---API调用中一个简单的语法错误就会导致VB 崩溃!(请经常保存您的工程).VB 并不能识别API调用中的错误,因此一旦你的程序出现异常,要先检查API调用---是否缺少 ByVal,或者是错误的类型,参数等等.从哪里得到有关函数的说明?这个主题不会告诉你如何通过API函数改变按钮文字或如何快速查找一个文件.这不是一个API函数文档.为了得到有关函数的说明,你需要SDK帮助或微软的SDK文档(至少有40M---我怎么可能放在这里?).这些SDK帮助通常都包含在Borland Dephli 3.0开发包或者MS Visual C++中.到网上去或找您的朋友要一个,版本越新越好注意Win3.x 的SDK 帮助对你并没有用,因为很多函数已经过于陈旧甚至废弃不用,尽管他们中的大多数由于与Windows95兼容而依然存在.API参数类型如果你已经有了一个SDK帮助,你肯定主意到了函数的返回之或参数有很多奇怪的类型如VOID,LPCSTR, 和DWORD.如果你对C语言比较熟悉的话,那你肯定明白它们的意思.对于其他不熟悉C语言的人,这里有一张摘自 VBBooks Online(标题是:C语言声明到Visual Basic的转换)Books Online(标题是:C语言声明到Visual Basic的转换)C 语言数据类型在VB中的声明 Call withATOM ByVal variable As Integer An expression that evaluates to an IntegerBOOL ByVal variable As Long An expression that evaluates to a LongBYTE ByVal variable As Byte An expression that evaluates toa ByteCHAR ByVal variable As Byte An expression that evaluates to a ByteCOLORREF ByVal variable As Long An expression that evaluates to a LongDWORD ByVal variable As Long An expression that evaluates to a LongHWND, HDC,HMENU,etc.(Windows handles) ByVal variable As Long An expression that evaluates to a LongINT, UINT ByVal variable As Long An expression that evaluates to a LongLONG ByVal variable As Long An expression that evaluates to a LongLPARAM ByVal variable As Long An expression that evaluates to a LongLPDWORD variable As Long An expression that evaluates to a LongLPINT, LPUINT variable As Long An expression that evaluates to a LongLPRECT variable As type Any variable of that user-defined typeLPSTR, LPCSTR ByVal variable As String An expression that evaluates to a StringLPVOID variable As Any Any variable (use ByVal when passing a string)LPWORD variable As Integer An expression that evaluates to an IntegerLRESULT ByVal variable As Long An expression that evaluates to a LongNULL As Any orByVal variable As Long ByVal Nothing orByVal 0& or vb NullStringSHORT ByVal variable As Integer An expression that evaluates to an IntegerVOID Sub procedure Not applicableWORD ByVal variable As Integer An expression that evaluates to an IntegerWPARAM ByVal variable As Long An expression that evaluates to a Long注释:你应该注意到了BOOL类型(Boolean)求出的值为Long而不是Boolean.因此0表示"假"(False),其他任何值表示"真"(True).HWND,HDC,HMENU,etc.---etc.指其他所有与于前面所述相似的类型.它们都以"H"开头来表示不同对象的句柄.举例来说,HBITMAP表示一副位图的句柄,HBRUSH标是一个刷子的句柄等等.它们均为Long 而且要按值传递(ByVal).同样要注意LPVOID被声明为Any型变量,本文将会有独立的一个主题用来论述Any类型.有些类型以"LP"开头.LP 是Long Pointer的缩写.因此LPWORD 实际表示数据所存的内存地址.不过,你并没有必要调用某个函数来获取这个地址.当你按引用(ByRef)传递参数时,你实际上传递的就是它的地址.在这里你只需记住:如果某个参数的类型以"LP"开头,应该按引用(ByRef)传递.顺便说一句,LPARAM 与Lparam 很相似但不是Lparam,Lparam不是一个指针,在这里你必须传递它的真实值,因此要按值(ByVal)传递.NULL也是一种奇怪的类型.你可以从VB 中了解到有关它的描述,这里我不去讨论它.按你需要的形式传递它吧,在大多数情况下,可以用ByVal 0& 或 vbNullString.最后,VOID是用来指那些没有返回值的函数的.API中没有SUBs,这就是它们的标志.只要记住:如果一个函数被声明为VOID ,你必须在VB 中把它声明为 SUB.。

VB API教程

VB API教程

VB API教程vbapi教程一、api是什么?这个我本来不敢说道的,不过也许你晓得其它人不晓得,这里为了照料一下新手,不得不说道些废话,恳请大家一致同意。

win32api即为microsoft32位平台的应用程序编程接口(applicationprogramminginterface)。

所有在win32平台上运行的应用程序都可以调用这些函数。

采用win32api,应用程序可以充份发掘windows的32十一位操作系统的潜力。

mircrosoft的所有32十一位平台都积极支持统一的api,包含函数、结构、消息、宏及USB。

采用win32api不但可以研发出来在各种平台上都能够顺利运转的应用程序,而且也可以充分利用每个平台特有的功能和属性。

以上为api的相关介绍,不过有些新手看了以后可能还是不怎么明白api到底有什么用?这里请不要着急,如果你有足够耐心的话,请慢慢往下看。

二、如何使用api?估算这才就是大家真正关心的,那么如何采用api呢?在介绍api之前,先关上你的vb书,甩至过程函数这章去,在搞清楚api之前必须先比如说过程函数就是怎么一两件事!如果你还不晓得过程的工作方式,那么恳请先不要着急着往下看看,那样难跑很多弯路。

好了,当你理解了过程函数时,也就是你可以使用api的时候了,别把api看得太难,你就像使用过程函数一样使用api就可以了。

首先,让我们看看一个简单的api,以下:privatedeclaresubsleeplib\aldwmillisecondsaslong)以上这个api的呢是起一个延时作用。

你如果是刚接触api的话可能会感到api的书写及其复杂,而且会感到很不适应。

其实这没什么的,慢慢习惯就好了。

至于api这些复杂的书写你就不用操心了,在你安装vb的时候微软已经帮我们带上了api浏览器,这些全部都可以利用api浏览器帮我们自动生成。

api浏览器的位置位于[开始菜单-程序-microsoftvisualbasic6.0中文版-microsoftvisualbasic6.0中文版工具-api文本浏览器]。

Win Api在VB中的妙用

Win Api在VB中的妙用
Win Api在VB中的妙用
Windows API作为一套功能强大的应用程序接口,使VB可以实现对Windows底层的控制,完成VB不具有的功能。下面介绍几种使用API函数的方法。
一、制作特殊窗口
1.各种形状的窗口(仅给出了函数名,具体定义可以查阅API Viewer)
1)CreateEllipticRgn 建立一个椭圆形的区域;
3.透明窗口
去年的《电脑报》上提供了一个制作透明窗口的办法,这里再介绍另一种方法:
Private Sub Form1_Load()
Dim p As Long
p = GetWindowLong(hWnd,GWLEX
STYLE) ′取得当前窗口属性
SetWindowLong hWnd, GWL_EXSTY
Declare Function SystemParametersInfo Lib ″user32″ Alias “SystemParametersInfoA” (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long
笔者经过反复思考,终于恍然大悟:看到黑体的“ByVal”了吗?问题就出在这里。原来该函数使用的lpvParam 参数应该按地址传送而非按值传送,然而VB Viewer 中使用的是按值传送,所以会出现错误提示。
(福建 桃花岛主)
本文出自:《电脑报》1999年03月22日第11期
Me.Refresh ′刷新窗口
End Sub
2.浮动窗口
Delphi中实现浮动窗口非常容易,只要在属性栏中设置就可以。用VB实现就只有借助于API函数:

API在VB中应用之技巧集锦

API在VB中应用之技巧集锦
'确定所在列
k=SendMessage(TextHwnd,&HBB&,-1,0)
ColNo=j-k+1
End sub
3、如何以某种颜色填充某区域?
*API函数声明
Private Declare Sub FloodFill Lib "gdi32" _ (ByVal hDC As Long, ByVal X As Long, ByVal Y As _ Long, ByVal crColor As Long
以上两个函数都可精确到毫秒级。
13、在程序中如何打开和关闭光驱门?
*API函数声明如下:
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
要交换鼠标按键,将bSwap参数设置为True。要恢复正常设置,将bSwap设置为False。 然后调用函数就可以交换和恢复鼠标按键了。
10、如何让窗体的标题条闪烁以引起用户注意?
在窗体中放一个Timer控件Timer1,设置其Inteval=200
*API函数声明
调用:
GetCursorPos z
print z.x
print z.y
12、怎样获得和改变双击鼠标的时间间隔?
获得鼠标双击间隔时间:

WIN32 AP

WIN32 AP
Int, INT ByVal Long
UNIT, DWORD ByVal Long
BOOL ByVal Long ture时为1
WPARAM, LPARAM, LRESULT ByVal Long
Handle(如HKEY) ByVal Long
WORD, ATOM, SHORT ByVal Integer
能和WinAPI的字串相?所幸我们可以先不用管它,因为vb本身做了转换,即 vb传给api时,
转了一次,传回时又转回 Unicode,所以如果我们用的是Byte Array来传字串,也可以但
是要自己去转码。。然而32位元的VB 中,字串有种格式,一个是BSTR,另一个是HLSTR
,如果我们宣告的串是非固定长度者,就会是BSTR,反之则为HLSTR。
BYTE, CHAR ByVal Byte
Windows Biblioteka PI 宣告 SHORT GetKeyState( int nVirtKey )
对应的VB宣告
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
的指令,但是它只能读取特定地区的值,要读、删、更动其他区域的值时,就无法使用
。再如:仔细看一看Combo Box的Events,其中没有MouseMove,但这是我们经常用上的
一个Event,那该如何呢?是的,那只有透过Winodow API。而VB呼叫Window API一般不
都使用API检视员,直接将相对应的API COPY到我们的程式中就好,那还用什麽技巧吗?
的取得便是利用RegQueryKeyEx的API 。程式部份在介绍Win API字串传递时再一并介绍。

在VB中使用API函数

在VB中使用API函数

在VB中使用API函数在VB中,可以使用API函数来实现一些高级功能或者与操作系统进行交互。

API(Application Programming Interface)是操作系统提供给开发人员的一组函数和接口,可以通过调用这些函数和接口来访问操作系统的底层功能。

1. 调用Windows API函数获取系统时间使用`GetSystemTime`函数可以获取当前系统的时间信息。

```vbPrivate Type SYSTEMTIMEwYear As IntegerwMonth As IntegerwDayOfWeek As IntegerwDay As IntegerwHour As IntegerwMinute As IntegerwSecond As IntegerwMilliseconds As IntegerEnd TypePrivate Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)Private Sub GetTimeDim sysTime As SYSTEMTIMEGetSystemTime sysTimeMsgBox "Current Time: " & sysTime.wHour & ":" &sysTime.wMinute & ":" & sysTime.wSecondEnd Sub```2. 调用Windows API函数显示消息框使用`MessageBox`函数可以显示一个消息框。

```vbPrivate Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As LongPrivate Sub ShowMessageDim result As Longresult = MessageBox(0, "Hello World!", "Message", vbInformation)If result = 1 ThenMsgBox "User clicked OK"ElseMsgBox "User clicked Cancel"End IfEnd Sub```3. 调用Windows API函数实现全屏显示使用`ShowWindow`函数可以设置应用程序窗口的显示状态。

vb在win32api.txt中

vb在win32api.txt中

如果过程没有返回值,可将其声明为 Sub:
Declare Sub publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])]
缺省情况下,在标准模块中声明的 API 过程是公有的,可以在应用程序的任何地方调用它。在其它类型的模块中定义的 API 过程是模块私有的,必须在它们前面声明 Private 关键字,以示区分。
vb在win32api.txt中为我们提供了很多预定义声明的API函数。但还是有很多API没有加进去的。所以我们要懂的如何在VB中自已手工去声明API.
尽管 Visual Basic 在 Win32api.txt 中提供了大量的预定义声明,但还是需要知道如何亲自编写声明。例如,有时希望访问用其它语言编写的 DLL 中的过程,或者改写 Visual Basic 的预定义声明,以满足特殊需要。
一.指定库
Declare 语句中的 Lib 子句用来告诉 Visual Basic 如何找到包含过程的 .API 文件。如果引用的过程属于 Windows 核心库(User32、Kernel32 或 GDI32),则可以不包含文件扩展名:
Declare Function GetTickCount Lib "kernel32" Alias _
二.处理使用字符串的 Windows API 过程
如果调用的 Windows API 过程要使用字符串,那么声明语句中必须增加一个 Alias 子句,以指定正确的字符集。包含字符串的 Windows API 函数实际有两种格式:ANSI 和 Unicode。因此,在 Windows 头文件中,每个包含字符串的函数都同时有 ANSI 版本和 Unicode 版本。

API函数在VB程序中的应用

API函数在VB程序中的应用

API函数应用作为一个编程初学者来说,API函数也许是一个时常耳闻却感觉有些神秘的东西。

单看它的复杂语法,就足令人望而生畏,但是任何事物在我们深入了解它之前,总是会有这种感觉的。

我们这篇API入门教程的目的,就是要把API函数的来龙去脉告诉大家,破除对API函数的畏惧,使它成为我们编程的好助手。

大家可能在许多书上看到过API的英文全称(ApplicationProgrammingInterface),WIN32API也就是MicrosoftWindows32位平台的应用程序编程接口。

对这个定义的理解,需要追溯到操作系统的发展历史上,当WINDOWS操作系统开始占据主导地位的时候,开发WINDOWS平台下的应用程序成为人们的需要。

而在WINDOWS程序设计领域处于发展的初期,WINDOWS程序员所能使用的编程工具唯有API函数,这些函数是WINDOWS提供给应用程序与操作系统的接口,他们犹如“积木块”一样,可以搭建出各种界面丰富,功能灵活的应用程序。

所以可以认为API函数是构筑整个WINDOWS框架的基石,在它的下面是WINDOWS 的操作系统核心,而它的上面则是所有的华丽的WINDOWS应用程序。

但是,那时的WINDOWS程序开发还是比较复杂的工作,程序员必须熟记一大堆常用的API函数,而且还得对WINDOWS操作系统有深入的了解。

然而随着软件技术的不断发展,在WINDOWS平台上出现了很多优秀的可视化编程环境,程序员可以采用“即见即所得”的编程方式来开发具有精美用户界面和功能强大的应用程序。

这些优秀可视化编程环境操作简单、界面友好(诸如VB、VC++、DELPHI等),在这些工具中提供了大量的类库和各种控件,它们替代了API的神秘功能,事实上这些类库和控件都是构架在WIN32API函数基础之上的,是封装了的API函数的集合。

它们把常用的API函数的组合在一起成为一个控件或类库,并赋予其方便的使用方法,所以极大的加速了WINDOWS应用程序开发的过程。

在VBA中使用WindowsAPI

在VBA中使用WindowsAPI

在VBA中使⽤WindowsAPIVBA是⼀种强⼤的编程语⾔,可⽤于⾃定义Microsoft Office解决⽅案。

通过使⽤VBA处理⼀个或多个Office应⽤程序对象模型,可以容易地修改Office应⽤程序的功能或者能够使两个或多个Office应⽤程序协同⼯作以完成单个应⽤程序⽆法完成的任务。

然⽽,使⽤VBA仅能控制操作系统的⼀⼩部分。

Windows API提供了控制操作系统绝⼤多数⽅⾯的功能。

下⾯,介绍在VBA中使⽤Windows API的⼀些知识。

理解APIsAPI只是⼀组函数,可⽤于处理组件、应⽤程序或操作系统。

通常,API由⼀个或多个提供某种特定功能的DLLs组成。

DLLs是包含函数的⽂件,能够从任何运⾏的Windows应⽤程序中调⽤DLLs。

在运⾏时,DLL中的函数被动态链接到调⽤它的应⽤程序⾥。

⽆论多少应⽤程序调⽤DLL中的函数,该函数仅存在于磁盘的单个⽂件中,并且DLL在内存中仅被创建⼀次。

您可能最经常听说的API是Windows API,它包括组成Windows操作系统的DLLs。

每个Windows应⽤程序都直接或间接地与Windows API相交互,Windows API确保运⾏在Windows下的所有应⽤程序都按⼀致的⽅式⼯作。

除了Windows API外,还有其它发布的APIs可⽤。

例如,邮件应⽤程序编程接⼝(MAPI)是⼀组⽤于编写电⼦邮件应⽤程序的DLLs。

APIs通常是由创建Windows应⽤程序的C和C++程序员编写,但能够使⽤VBA调⽤DLL中的函数。

因为⼤多数DLLs最初都是由C/C++程序员编写和⽂档规范,所以调⽤DLL函数与调⽤VBA函数不同。

为了使⽤API,必需理解如何传递参数到DLL函数。

为了调⽤Windows API中的函数,需要描述这些可⽤的函数的⽂档规范,如何在VBA中声明这些函数,以及如何调⽤它们。

下⾯是两个有⽤的资源:1、Win32API.txt⽂件,包含Windows API中⼤多数函数的VBA Declare(声明)语句。

让VB用足用活WindowsAPI调用

让VB用足用活WindowsAPI调用

让VB用足用活WindowsAPI调用胡文俊【期刊名称】《计算机时代》【年(卷),期】1998(000)002【摘要】Visual Basic以其灵活简便、易学易用的可视化的集成开发环境,面向对象以事件驱动的编程方法使Windows编程变得轻松自如、快速高效。

现在虽有不少其它开发工具,在某些性能、特点方面已接近甚至超过VB,但VB的应用是最成熟的,客观地讲,VB不是最好的,也不可能有最好的。

关于它的不足只要进行适当的扩充,对于大多数需求还是能很好地达到目的。

尤其是Windows API提供的数百个接口函数,很多“VB的不足”都可得到很好地解决。

这里,通过用API函数SendMessage对VB进行的一些扩充实例给读者一点启示,用足用活Windows API扩展VB功能,加速应用程序的建立。

一、添加列表框控体的水平滚动条 VB 中列表框控体(List box)只能设置垂直滚动条(VScroll),而没有提供水平滚动条(HScroll)。

这样,当包含于列表框内的文本长度超出列表框边缘宽度时,超出部分就不能显示。

这时,为List box控体增加水平滚动条就很有必要。

通过使用Windows API函数SendMessage可以解决这一问题。

函数SendMessage通过调用参数LB—SETHORIZONTALEXTENT比较列表框与其所包含的文本宽度(像素值)重新设置列表框,如果文本宽度大于列表框宽度,则显示水平滚动条,否则水平滚动条不起作用。

在Forml中创建列表框Listl和按钮Commandl,并相应地加入?【总页数】2页(P25-26)【作者】胡文俊【作者单位】无【正文语种】中文【中图分类】TP311【相关文献】1.让VB用足用活WindowsAPI调用 [J], 胡文俊2.VB调用WindowsAPI函数的方法 [J], 闵联营3.用好用足用活RCEP助力福建自贸区形成"双循环"新发展格局 [J], 董建东4.明确"五个意识"抓实"三个环节"——用足、用好、用活《语文作业本》策略谈 [J], 周颖5.用足用好用活生物学教材,有效落实学科核心素养--以《生物学·必修1·分子与细胞》为例 [J], 周湘因版权原因,仅展示原文概要,查看原文内容请购买。

略论如何用API函数优化VB窗口程序

略论如何用API函数优化VB窗口程序

略论如何用API函数优化VB窗口程序金龙海;王旭东【摘要】本文提供了一个利用API函数优化VB窗口程序的实例,介绍了VB开发人员可通过调用API函数,在VB窗口程序运行前调用自己编写的函数,可做到拦截Windows消息,修改某些Windows消息对应的事件或屏蔽掉用户不需要的一些事件.%The paper provides an example that API functions are used to optimize the VB Window procedures. The paper also explains that VB developers can call the function written by them by calling API functions before the VB window procedure runs, so as to intercept Windows messages, modify some events which Windows messages correspond to, or shield some events the user does not need.【期刊名称】《吉林师范大学学报(自然科学版)》【年(卷),期】2012(033)003【总页数】3页(P55-56,60)【关键词】窗口程序;API函数;事件;消息【作者】金龙海;王旭东【作者单位】吉林大学公共计算机教学与研究中心,吉林长春130012;吉林大学公共计算机教学与研究中心,吉林长春130012【正文语种】中文【中图分类】TP311.1事件驱动模式是VB程序设计的主流,而VB又是在Windows下运行的,所以需要将从Windows得到的消息转化为VB中对应的事件.我们可以拦截Windows传给VB的消息,并修改对应的事件过程,或把自己不需要的一些事件过程屏幕掉,那么具体应该如何截获并处理呢?VB中,在窗口的内部,有一样最重要的东西称为“窗口程序”,它的用途是接收来自Windows的消息.当VB建立某个对象时,会为该对象提供一个窗口程序,窗口程序的功能是接收来自Windows的消息,并且将一部分消息转化成对应的事件,以驱动该消息所对应的事件过程[1].如图1所示.dows传过来的消息,由于消息都是常量或数值,所以该参数的类型是Long型.Msg参数接收的消息都是以WM开头的,如:WM_RBUTTONDOWN表示按下鼠标右键时传过来的消息值.窗口函数中需要调用一个DefWindowProc函数,此函数是为了减少窗口程序的负担所提供的函数.一般来说,Windows程序员使用switch和case结构来确定窗口过程接收的是什么消息,以及如何适当地处理它.窗口过程不予处理的所有消息应该被传给名为DefWindowProc的Windows函数.VB中每个窗口都对应的有一个窗口函数Wnd-Proc,该函数中有四个参数,我们重点需要了解下面两个参数的意思:(1)hWnd:消息发向的窗口的句柄,用来唯一标识窗口.(2)Msg:接收消息的参数.用来接收从Win-VB中Form1窗体上画三个文本框,三个文本框从上到下依次名为t1,t2,t3,建一个菜单,菜单的名称为“运算(Oper)”,该菜单下有四个命令按钮,分别为:加法(Add),减法(Sub),乘法(Add),除法(Div).该程序的功能是:当在前两个文本框中输入要计算的值,然后在第三个文本框中要得到它们的运算结果,我们可以为菜单中的每个命令按钮对应地编写程序[2].现在只要程序运行起来后,在t1和t2中输入要计算的值,之后点击运算菜单下的对应命令,即可在t3中得到结果.现在要实现的是在t3中点击鼠标右键,把“运算”这个菜单以快捷菜单方式弹出来,如图2所示.实现的方法是在VB中为t3的MouseDown事件加入下面代码:当程序运行的时候会发现,在t3中点击鼠标右键会出现快捷菜单(Oper),但每次都是先出现系统的快捷菜单,再点一下才会出现我们自己的菜单,那么如何改善呢,不让系统的快捷菜单出现呢?之所以在t3中单击鼠标右键会先出现系统的快捷菜单,是因为建立t3文本框时,文本框对应的窗口程序会接收来自Windows的右键消息,之后将该消息转化成为对应的事件,并驱动文本框对象的事件过程.文本框对应的窗口程序是隐藏起来的,我们无法去改编它来完善程序,只能按照窗口函数的样子自定义一个函数,实现自己所需要的功能了.自定义的函数:此函数的功能是:接收t3文本框传过来的句柄,捕捉到在t3中按下鼠标右键的消息,只弹出用户自定义的快捷菜单Oper,也就屏蔽掉了t3中系统默认的快捷菜单.但当我们让系统运行我们自定义的函数的时候,我们不可能把窗口程序原来提供的所有消息处理都补上,所以需要将其它消息交由原窗口程序来处理.CallWindowProc(pointWndProc,hWnd,Msg,wParam,lParam)语句就是实现调用原窗口程序的.该语句中pointWndProc是原窗口程序的地址,取得该地址的方法是:如何让VB程序运行的时候,不直接运行窗口函数,而是运行上面自定义函数呢?我们可以在窗口的Load事件中用如下的API函数来调用自定义函数.此程序中我们要修改的是t3中对应的事件,所以调用自定义函数时传过去的是t3的句柄,好让自定义函数能够接收到在t3中按下鼠标右键的消息.通过上面介绍的方法我们可以拦截Windows传给VB的消息,不让该消息对应的事件发生,或者用自编的函数来代替该消息所对应的事件,以优化VB窗口程序.【相关文献】[1]王国荣.Visual Basic 6.0与Windows API讲座[M].人民邮电出版社,2000.[2]刘圣才,李春葆.Visual Basic 6程序设计导学[M].清华大学出版社,2002.[3]曹丽华,谭振江.利用VB.NET设计LED电子广告牌[J].吉林师范大学学报(自然科学版),2010,31(1):141~143.[4]陈健.VB.NET多线程技术及其应用[J].吉林师范大学学报(自然科学版),2008,29(1):61~62.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VB的数据类型不够丰富,整形数只包括Byte、Integer、Long三种类型,分别对应C++中的 unsigned char、short 和 long 类型,而我们常用的二字节无符号整形unsigned short(也叫“字”、Word)、四字节无符号整形unsigned long(也叫“双字”、DWord)在VB中却没有被支持。 但好在无符号数和有符号数在二进制的层次上没有任何差别,不同之处仅在于编译器对变量的理解。在进行位操作时我们只关心变量的二进制位,因此VB中的Integer类型可以当作Word类型使用,Long类型则对应DWord。(此后文中提及的Integer类型均指VB Integer类型,Long类型均指VB Long类型,Word 、DWord类型则是不依赖于特定编译器的对二字节、四字节整形值的通用称呼)再来看位运算方面,可以看出VB不支持整型变量的左移、右移、拆分、合并等操作。
CopyMemory ByVal VarPtrArray(pBytesInLong), VarPtr(SA1D), 4
i = &HFFFFFFFF
MsgBox pBytesInLong(1) '访问长整形变量的第2个字节(从低处开始数)
pBytesInLong(3) = 0 '把全部数组元素设为0
由于代码较长,故没有在文章中写出全部代码,全部代码请到编辑部网站下载。
方法2:利用安全数组借用内存的方法实现
方法1虽然用起来简单方便,但是要执行API函数调用,函数调用时要保存现场、恢复现场,时间开销很大,效率太低,因此不适合大数据量密集运算的场合。笔者在开发加密软件时曾使用方法1来处理文件数据,效果很不理想,速度奇慢。其实有一种方法可以巧妙的骗过VB,让一个数组直接访问其他变量的内存空间,从而达到拆分、合并整形变量的目的。由于这种方法省去了API函数调用,因此效率非常高。下面就让我们认识一下VB中的安全数组。VB中的安全数组与C语言中的数组有很大的差别,虽然在VB和C语言中数组变量都是指针,但C语言中的数组变量直接指向数组元素,而 VB中的数组变量却是指向一个SafeArray结构,这个SafeArray结构中的pvData域才指向数组元素。见图
二设计思路
1. 实现整形变量的拆分、合并
整型变量的拆分、合并是经常要用到的操作,比如IP地址就是一个四字节的双字,有时候为了以点分十进制的方式显示IP地址,就需要单独取出每个字节的值,而有时候为了把点分十进制的IP地址转换为计算机内部的双字,又需要把四个字节组合成一个双字。VB没有提供这样的功能,所以整型变量的拆分、合并也是我们这次要实现的功能。另外整型变量的拆分、合并也是实现Integer、Long类型变量移位的前提条件(后面“分而治之策略”将会提到),只要实现了整型变量的拆分合并,移位问题就完全解决了。
经过上述的分析之后,已经确定了工作的可行性和工作目标,于是笔者决定开发一个通用模块来增强VB的位操作功能,这个模块是可重用的,只要把这个模块加入工程中,就可以象使用VB的内置函数一样透明的使用模块中的函数,非常方便。如果使用大量的可重用模块来开发程序,则开发周期短,代码可读性好,易于维护,不容易出错。
巧用Win32 API函数增强VB位操作功能
(作者:刘琦)
一 引言
笔者在编程实践中发现,VB对位操作的支持仅限于AND、OR、XOR几种位运算,远远不如其他的开发工具那样全面(如Visual C++、C++Builder、Delphi等开发工具都提供了整形变量的移位、拆分、合并的运算),因此在使用VB编写诸如加密之类的通用数据处理程序时往往困难重重。为了使以后的开发工作不再陷入僵局,我开始寻求增强VB位操作功能的通用方法,以达到一劳永逸的效果。
pvData As Long '指向数组元素的指针
cElements As Long '维定义,该维的元素个数
Lbound As Long '该维的下界
End Type
如果显式的给一个数组变量赋值,让它指向我们自己创建的SafeArray结构,就可以通过设置SafeArray结构的pvData域来访问任意内存位置。请看示例代码:
方法1:利用API函数Copymemory实现
在这里笔者利用Win32 API 函数CopyMemory实现了整形变量的拆分、合并操作。在
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
‘把BYTE类型变量右移1位的函数,参数Byt是待移位的字节,函数返回移位结果
‘/2:右移一位
ShRB_By1Bit = Fix(Byt / 2)
Public Function Hi(ByVal Word As Integer) As Byte
'取一个字(Word)的高字节(Byte)
'INPUT-------------------------------------------
'Word 字(Word)
End Function
类似的把BYTE类型变量右移1位时采用除以2的方法 ,这时要注意舍去小数位,以免VB按照四舍五入的方法处理小数位而引起结果不正确。据此我们可以写出把BYTE类型变量右移1位的函数:
Private Function ShRB_By1Bit(ByVal Byt As Byte) As Byte
Public Declare Function VarPtrArray Lib "msvbvm60.dll" _
Alias "VarPtr" (ptr() As Any) As Long
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
.cbElements = 1
.clocks = 0
.pvData = VarPtr(i) '使数组的数据指针指向长整形变量 i
.cElements = 4
.Lbound = 0
End With
'使数组变量(其实就是个指针)指向我们自己创建的 SafeArray1d 结构
(Destination As Any, Source As Any, ByVal Length As Long)
其中的参数Destination是目标内存的第一个字节地址,参数Source是被复制内存的第一个字节地址,参数Length是需要复制的字节数。
实现原理很简单:要实现拆分,就用CopyMemory函数把一个整形变量的一部分拷贝到另一个更小的整形变量的地址空间中;而实现合并,则利用CopyMemory函数把两个待合并的小变量拷贝到另一个大整形变量的地址空间中。见示例代码:
那么这个SafeArray结构是做什么用的呢?它存储着数组的上界、下界、维数、元素大小等一系列的信息,正是SafeArray结构的存在,使得VB程序能够对数组的访问做越界检查,这就是为什么VB中的数组叫做安全数组的原因,而C语言中的数组显然不具备越界检查的能力。当然安全数组的缺点就是没有C语言的数组灵活,但尽管如此,我们还是有办法操纵它,通过对安全数组的操纵,可以让它访问任意的内存位置,甚至包括其他变量的内存空间。对于一维数组来说,它的SafeArray结构如下:
Hi = bytRet’返回结果
End Function
根据数据类型的不同需要,笔者共设计了6个函数,HI()函数用来获得一个单字的高字节,LO()函数获得单字的低字节,HIWORD()函数获得双字的高位字,LOWORD()函数双字的低位字。CON()函数把两个字节组合成字,CONWORD()函数把两个字组合成双字。只要把这6个函数组合应用就可以随意的拆分、组合各种整型变量。例如前面提到的IP地址,IP地址是用一个DWORD类型变量存储的,在VB中则对应Long类型变量,假设一个IP地址存储在长整型变量中,就可以这样提取一个IP地址的最高字节:HI(HIWORD(lngIP))。
pBytesInLong(2) = 0
pBytesInLong(1) = 0
pBytesInLong(0) = 0
MsgBox i '你会发现 i 也变成了 0
'把数组变量(其实就是个指针)指向 0,既 C 语言中的 NULL
CopyMemory ByVal VarPtrArray(pBytesInLong), 0&, 4
23
22
21
20
可以看出每一位的权值都是比它低一位的那一位的权值的2倍,对一个BYTE变量左移一位相当于每一个二进制位都向高位移动,则每一位的权值变为原来的两倍(最高位除外),由于BYTE变量的十进制值等于它的每个二进制位的值和该位权值的乘积的总和,所以把一个BYTE变量左移和把它的十进制值乘以2是等效的,唯一的区别就是如果BYTE变量的最高位为 1,乘以2会溢出,我们要使用一个小技巧防止溢出:先把最高位屏蔽为0,再乘以2就不会溢出了。据此我们可以写出把BYTE类型变量左移1位的函数:
Private Function ShLB_By1Bit(ByVal Byt As Byte) As Byte
‘把BYTE类型变量左移1位的函数,参数Byt是待移位的字节,函数返回移位结果
‘(Byt And &H7F)的作用是屏蔽最高位。 *2:左移一位
ShLB_By1Bit = (Byt And &H7F) * 2
相关文档
最新文档