转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
Common Control - The VB Way (1)         ★★★★

Common Control - The VB Way (1)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1629 更新时间:2009/4/23 16:40:08

Common Control: The VB Way!

子夜软件工作室

  “救救我!为什么我做的小程序用VB安装向导打包后变得那么大?”我们几乎可以在所有的VB论坛上看到这样的帖子。这个糟糕的结果源自VB方便的开发方式:一些VB程序员几乎毫不节制地使用ActiveX控件,而安装向导只是一个没有知觉的程序,它把那些ActiveX控件全部加入发行包——于是你就会跑到网上发帖子求救。

  怎么办?简单的方法是用UPX压缩EXE、DLL,但是治标不治本。这篇文章将告诉你或许可以“治本”的方法——如果你的程序需要用到一些Common Control而不得不带上MSCOMCTL.OCX、MSCOMCT2.OCX,我们可以帮你甩掉这1.22MB的包袱!

  这就是Common Control: The VB Way!

 

 

一、      准备知识

  在具体讲述怎么脱离Microsoft Common Control ActiveX控件创建你想要的东西前,我们需要有一点准备知识。

一、      Windows 消息循环基本原理。
这不是本文的主题,但却是最重要的基础知识,如果你不太明白,最好找基本的C++ for Windows的书看看先。

二、      Visual Basic 变量指针和函数指针。
这么说很勉强,因为在VB中我们只能获得地址,要像C那样灵活使用指针似乎不可能。下面详细介绍三个函数和一个操作符,他们都是VB6内置的,无需声明:
VarPtr(Ptr As Any) 函数
这个函数返回一个变量(或者是数组元素)的地址。通过这个地址,我们将能够直接访问里面的内容。参数Ptr是任意变量或者数组元素。对于字符串变量,它返回这个变量的ANSI Buffer地址。
StrPtr(Ptr As String) 函数
这个函数返回一个字符串变量的Unicode Buffer地址,请注意和VarPtr()的区别。参数Ptr是任意字符串变量。
ObjPtr(Ptr As Unknown) 函数
这个函数专门用来获得VB对象变量的地址。
AddressOf 操作符
返回一个标准模块中SubFunction的地址。使用这个操作符有一个小技巧:这个操作符无法直接赋值给变量(它只能用于函数参数中),所以,为了把一个Function的地址存放在变量中,我们需要这样一个Dummy函数:
Public Function ProcAddr(ByVal lpProc As Long) As Long
  ProcAddr = lpProc
End Function
这样,我们就可以把Test()函数的地址保存在lpTest变量中:
lpTest = ProcAddr(AddressOf Test)

三、      API函数、常量的声明
由于篇幅有限,在下文中,所有的API函数、常量我们均不列出声明代码。您可以从http://www.greatmidnight.com/downloads/bintool/wintlb.ziphttp://www.greatmidnight.com/downloads/bintool/tl_comctl.zip下载到常用Win32APICommon Control 5.80的函数、常量声明。这是两个Type Library 文件,您可以从VB的“Project(工程)——Reference(引用)”菜单中添加对这两个文件的引用,这样您就无需手工声明常用的Win32 APICommon Control 5.80函数、常量了。

 

 

二、      获取当前系统Common Control的版本

  在使用Common Control之前,你必须弄清楚当前系统安装的是哪个版本——有许多新特性是自Common Control 5.x之后才加入的,对于旧版本使用这些特性会有什么后果?自己猜猜。本节我们就来讲如何获得ComCtl32.DLL的版本号。

  许多Windows Shell的动态连接库都有这么一个函数:DllGetVersion()。我编写了下面这个函数来获得指定Shell动态连接库的版本号:

Public Function GetDllVersion(ByVal DllName As String, _
                                ByRef MajorVersion As Long, _
                                ByRef MinorVersion As Long, _
                                ByRef BuildNumber As Long, _
                                ByRef PlatformID As Long, _
                                Optional ByVal bDefaultIE3 As Boolean = True)
As Boolean
    '''' 此函数用于获得 Windows 的 Shell32.DLL 等 DLL 的版本信息。
    On Local Error GoTo Shell32VerErr
    Dim SecurityAttr As SECURITY_ATTRIBUTES
    Dim hThread As Long, ThreadID As Long
    Dim hModule As Long, lpThreadAddr As Long
    Dim VerInfo As DLLVERSIONINFO
    Dim ExitCode As Long
    Dim ErrorOccurred As Integer

    ErrorOccurred = 0

    '''' 先要装入 DLL。
    hModule = LoadLibraryEx(DllName, vbNull, 0)
    If hModule > 0
Then
        '''' 然后找到函数 DllGetVersion() 的地址。
        lpThreadAddr = GetProcAddress(hModule, "DllGetVersion")
        If lpThreadAddr > 0
Then
            With SecurityAttr
                .lpSecurityDescriptor = 0
                .bInheritHandle = 0
                .nLength = Len(SecurityAttr)
            End With
            VerInfo.cbSize = Len(VerInfo)

            '''' 真可惜!VB 无法通过地址直接调用函数,所以只好通过建立一个线程的方法来代替。
            hThread = CreateThread(SecurityAttr, 0, ByVal lpThreadAddr, _
                                    VerInfo, 0, ThreadID)
            If hThread > 0
Then
                '''' 然后等待 DllGetVersion() 返回。
                Do
                    GetExitCodeThread hThread, ExitCode
     

[1] [2]  下一页


[系统软件]The GRETA Regular Expression Template Archive  [系统软件]OLE with the internet explorer
[常用软件]Firefox: What’s the next step?  [VB.NET程序]The UDPChat Source(VB.NET)
[VB.NET程序]几个 WMI 的例子(初级) - 1  [VB.NET程序]几个 WMI 的例子(初级) - 2
[VB.NET程序]几个 WMI 的例子(初级) - 3  [VB.NET程序]几个 WMI 的例子(初级) - 4
[Delphi程序][Tips]挂起 - 运行外部程式,外部程式退出 - 继续…  [Delphi程序]升级到Delphi 6 - 兼容性问题(中文全文)
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台