Common Control - The VB Way (1)

.NET6实现对西门子1500PLC的开放式TCP/IP数据读取与写入 先建立json文件点表: { "ConnectionStrings": { "SqliteConnectionString": "Data Source=D:\\Csharp\\code\\STM32Demon\\STM32Demon\\bin\\Debug\\net6.0-windows\\Database\\DbSqlite.db", "MySQLConnectionString": "server=127.0.0.1; database=OneToMany; uid=root; p 阅读详情

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
 操作符
返回一个标准模块中Sub或Function的地址。使用这个操作符有一个小技巧:这个操作符无法直接赋值给变量(它只能用于函数参数中),所以,为了把一个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.zip和http://www.greatmidnight.com/downloads/bintool/tl_comctl.zip下载到常用Win32API和Common Control 5.80的函数、常量声明。这是两个Type Library 文件,您可以从VB的“Project(工程)——Reference(引用)”菜单中添加对这两个文件的引用,这样您就无需手工声明常用的Win32 API、Common 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
                Loop Until ExitCode <> STILL_ACTIVE
                CloseHandle hThread ' 关闭线程。
            Else
                ErrorOccurred = 3 ' 建立线程出错。
            End If
        Else
            ErrorOccurred = 2 ' 找不到 DllGetVersion() 入口地址。
        End If
        FreeLibrary hModule
' 释放 DLL。
    Else
        ErrorOccurred = 1 ' 无法装入 DLL。
    End If

    If Not ErrorOccurred Then
        With VerInfo
            MajorVersion = .dwMajorVersion
            MinorVersion = .dwMinorVersion
            BuildNumber = .dwBuildNumber
            PlatformID = .dwPlatformID
        End With
    ElseIf
ErrorOccurred = 2 And bDefaultIE3 Then
        ' 找不到入口地址,说明是 IE 3.0 的 4.0 版 Shell32。
        MajorVersion = 4: MinorVersion = 0: BuildNumber = 0: PlatformID = -1
    Else
        GoTo
Shell32VerErr
' 无法预料的错误……
    End If
    GetDllVersion =
True
    Exit Function

Shell32VerErr:
    GetDllVersion = False
End Function

  使用“comctl32.dll”作为第一个参数调用这个函数,我们就可以获得它的版本号了。在我的系统中,MajorVersion、MinorVersion、BuildNumber将分别是:5、81、4522,即Common Control版本:5.81.4522。

  在确认系统中的Common Control是5.x版本后,我们就可以开始下面的正活儿了!

(待续……)

 

关于VB6.0的Microsoft windows common control 6.0 对象库未注册问题 如题, 关于这个问题,我在网上找了好多方案,但都不管用。 下面为脚本方法(win32位系统与win64位系统需进入不同的文件夹下,执行下面的脚本) 32位系统 cd C:\Windows\System32 64位系统 cd C:\Windows\SysWOW64 regsvr32 MSCOMCTL.OCX regtlib msdatsrc.tlb 需要注意的是,re 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 12 公有云里的“多Region + 多AZ“ 02 运营算法01

算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)云厂商提高闲置资源利用率。算法复杂度为O(N),N为实例数量。

weixin_49199313的博客 282

WINFORM界面设计

this.ckbAutoControl.Font = new System.Drawing.Font("阿里巴巴普惠体 3.0 55 Regular", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));

m0_68485265的博客 1523

win7(64位)VB6.0加载控件MSCOMCTL.OCX时提示对象库未注册的解决办法

win7(64位)安装VB6.0后,加载控件Microsoft Windows Common Controls 6.0 (SP6) (即MSCOMCTL.OCX)时,提示对象库未注册。 运行压缩内的注册ocx.bat即可。

框架通用工具类CommonLibrary

CommonLibrary CommonLibrary是一个工具类通用框架,旨在为开发者提供各类开发工具,以提高开发效率。本库也将持续更新 联系方式 github地址:https://github.com/Alin520/CommonLibrary。 掘金地址:https://juejin.im/post/5a7941c96fb9a0633f0dfe64 优快云...

hailin123123的博客 2168

深入解析postcss-px-to-viewport-8-plugin:如何精准控制响应式转换范围

本文深入解析了postcss-px-to-viewport-8-plugin插件在响应式开发中的核心痛点——如何精准控制单位转换范围。针对插件默认全局转换的问题,文章提供了两种实战解决方案:通过编写巧妙的exclude正则表达式实现“曲线救国”,或直接修改插件源码补全include功能。同时,文章还分享了在Next.js、Vite等现代框架中的集成要点及常见问题排查方法,帮助开发者实现“外科手术式”的精准样式转换。

yoga7的博客 910

TP4054充电电路发热严重?手把手教你调整电阻值降低温度(附实测数据)

本文针对TP4054锂电池充电电路发热严重的问题,提供了详细的排错与解决方案。通过分析发热原理,指出核心在于PROG引脚电阻值设定,并手把手指导如何计算和选择正确的电阻以降低充电电流与温度。文末附有不同电阻下的实测温度与性能数据,为电子爱好者和工程师提供了实用的调试参考。

p4q5r6s7t的博客 406

Thingsboard 3.1.0 - 远程控制和GPIO状态显示

GPIO widgets 主要用来对设备的GPIO状态的显示和控制。 一、GPIO状态显示 显示画面大致如下: 1、【高级】: 主要设置GPIO LED的位置,默认颜色,Pin,标签,背景色等。 其中Pin(接脚)设置的值很重要,根据数据的值控制那个Pin的Led灯亮。 2、【数据】: 主要用来设置什么数据为TRUE时,控制那个Pin的Led灯亮。 下例中使用了函数,实际业务中可以使用设备对应的实体,数据源一般为时间序列或者属性。 数据键配置中,标签(label)设置的和前面的Pin对应,表示此值为

qgbihc的专栏 1991

在Proteus中用80C51模拟4线SPI点亮OLED屏幕

在Proteus里用80C51模拟4线SPI控制OLED屏幕使其显示图案(汇编实现)。

Connor3093的博客 5003

thingsboard rpc api使用调试记录

things board rpc调用调试心得记录

yeamon的博客 876

基于Slim-Neck架构的YOLOv11轻量化特征融合方案(实现超轻量级与高精度的双重突破)

购买即可解锁800+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,每日更新。

m0_64661770的博客 250

Roboflow 与 YOLOv11 数据集全流程:从获取到训练,让你数据无忧

上传图像:点击“Upload”按钮,批量上传本地图像(支持 JPG、PNG 格式,单张最大 10MB)。智能标注:利用 Roboflow 的“Auto-Annotate”功能,基于预训练模型自动生成标注,再手动微调,标注效率提升 70%。格式导出:标注完成后,同样选择“YOLOv11”格式导出,流程与公开数据集一致。

m0_71589036的博客 272

go c java 性能测试_软件测试中的C, Erlang, Java, Go 语言的Web Server 性能测试

软件测试中的C, Erlang, Java, Go 语言的Web Server 性能测试发表于:2010-07-23来源:作者:点击数:软件测试中的C, Erlang, Java, Go 语言的Web Server 性能测试 对C, Erlang, Java and the Go 编程语言的Hello world web服务进行了测试 . * C, 使用高性能的web server-nginx,以...

weixin_36423062的博客 270

置顶必读(3) |《滚雪球学SpringBoot》· 高质量专栏介绍,你值得拥有!

《滚雪球学SpringBoot》 并不是普通的技术讲解合集,它是专为开发者精心设计的系统化学习路径。通过不断“滚动学习”,我们将带领你从基础入门到高阶应用,从理解每一行代码到设计和优化大规模分布式系统,最终帮助你成长为一位精通 spring架构 的工程师。

**My Coding Family** 15万+

C, Erlang, Java and Go Web Server performance test

C, Erlang, Java and Go Web Server performance test http://timyang.net/programming/c-erlang-java-performance/  

langxianwu的专栏 170

【经验&技巧】如何在ADS中导入示波器的时域波形?

从示波器中导出的时域波形数据,需要按照固定的格式进行修改,并通过Display dataset对话框导入ADS。

一只豌豆象的博客 1572

022、Conv-BN-SiLU 基础卷积块:构造函数参数计算,前向传播的 PyTorch 逐行实现

本文详细解析了Conv-BN-SiLU卷积块的实现细节与注意事项。作者从调试经历出发,指出bias参数冗余会导致数值不稳定,强调卷积层应设置bias=False。文章对比了SiLU与ReLU的特性差异,逐行分析了构造函数参数计算(包括自动填充、分组卷积等)和前向传播过程,特别讲解了BN层与SiLU激活的数值特性。最后分享了三个实践中的常见问题:BN的momentum设置、SiLU输出范围的影响,以及分组卷积的通道对齐要求,并提供了卷积与BN融合的推理优化技巧。全文聚焦实际工程实现中的关键细节,具有较强实操指

ai技术增长的博客 218

编程语言性能深度解析:从原理到选型实践

在软件工程中,编程语言的运行速度是系统性能的核心考量因素之一。其本质取决于语言的抽象层级、编译器优化能力和运行时环境设计。静态编译语言通过直接生成机器码实现高效执行,而动态语言则通过即时编译和运行时优化在特定场景下逼近原生性能。从技术价值看,理解不同语言的性能特性有助于在系统架构设计、高并发处理和计算密集型任务中做出精准的技术选型。例如,在微服务架构和云原生场景下,Go语言的并发模型能显著提升I/O密集型服务的吞吐量;而在数据科学和机器学习领域,Python凭借其丰富的C扩展库生态,在向量化运算中展现出卓越

weixin_30542079的博客 410

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ARM信创桌面开发环境搭建:从终端、语言运行时到数据库的完整工具清单

CPU架构差异决定了软件生态的分野。x86_64与aarch64的二进制互不通用,这是信创台式机迁移到银河麒麟V10后面临的最直接挑战。理解架构适配原则是搭建高效开发环境的前提:优先选择官方ARM64原生构建,其次依赖JVM、Python、Node.js等跨平台运行时,再考虑源码编译,最后才用兼容层填补缺口。基于这一思路,本文从终端工具、语言运行时与交叉编译工具链、数据库与中间件、兼容旧生态方案、系统配置优化等维度,梳理了一套经过实际验证的ARM信创桌面开发工具链。针对高频问题如依赖冲突、编译器版本缺失、D

weixin_34175509的博客 219

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

主流压力测试工具深度解析:从JMeter到k6的选型与实战指南

压力测试是软件性能工程的核心实践,旨在通过模拟高并发用户访问,评估系统在极限负载下的吞吐量、响应时间、错误率及资源消耗等关键指标。其原理在于主动制造可控的流量冲击,以暴露潜在的性能瓶颈、容量限制和稳定性问题,从而避免生产环境中的服务中断与用户体验下降。在微服务、云原生架构普及的今天,性能测试的价值愈发凸显,它不仅是上线前的关键验证环节,更是持续交付流程中保障服务SLA的重要手段。应用场景涵盖电商大促、秒杀活动、API服务扩容及新系统上线等各类高并发业务。本文将聚焦于**JMeter**、**k6**、**L

weixin_34013044的博客 335

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

如何给vb的UserControl添加属性、方法和事件?

一、属性的派生 Public Property Let 属性名(ByVal NewValue As 类型名) PropertyChanged "属性名" End Property Public Property Get 属性名() As 类型名 End Property 如果是只读的属性,缺省Let过程即可。 二、方法的派生 Public Sub 方法名(参数表) End Sub Publ

autumn20080101的专栏 3652

vb.net中让控件内容为空(Control类)

在平常的敲系统中大家有没有遇到需要让Textbox控件或者其他的控件的显示内容为空,以前直接的做法是直接等于空值,如何此类控件有很多,都需要空值难道都要设置一下它的值为空嘛,显然这是一个笨办法,有没有更好的方法让呢,答案是

只布布倩 3114

【问】运行升级包时提示系统错误

【问题描述】 如何解决软件升不了级,运行升级包时报系统错误? 【答】 点击“开始”—“运行”输入regsvr32 "C:\Program Files\Common Files\System\ado\msado15.dll"对该库文件进行重注册。 ...

194

VB 实现VC TAbControl控件

VB实现VC TabControl控件   新建一个工程文件Project1,     在左侧工具栏中点右键   在出现的选项中点“Components”,在打开窗口中找到“Controls”选项也中的“Microsoft Tabbed Dialog Control 6.0”,然后点“应用”“确定”退出该页面   此时,在工具栏的右下角会出现刚添加的组件SSTab  

alex323521的博客 1718
下一篇: OPENFILENAME 新元素初探
DevilXelloss
博客等级 码龄25年 5粉丝 7原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值