VB深度下潜 之 一米深度(VB指针入门)

在VB6中使用指针:字节的计算 版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明作者:xixi出处:http://blog.youkuaiyun.com/slowgrace/archive/2009/04/26/4124347.aspx本文主要来自此帖的讨论,感谢unsigned、Soyokaze、Chen8013、Tiger_Zhao、m60a1、myjian、PctGL等朋友的指 阅读详情

前 言

 

 

 

本来我也是非常赞同网上一个流行的观点,VB只是一个玩具。诚然,作为一个VB的普通使用者的确无法玩出更多的东东。但是,这几个月我完全不管VB的普通应用,而是一头扎入COM的海洋里,凭着潘爱民老师的一片小帆《COM原理及应用》以及一袋干粮《Advance Visual Basic》。居然在冰冷的技术海洋里转了几个月。终于发现了一个VB惊天之迷。然后当然有了这个长篇。

如里不是偶然,在五笔字型里,VB是代表“好”字。但我所说的迷不是指这个。请你跟随我来拨云见日,看清VB是什么。如果当你全部看清了以下的事实,我相信你不会说VB是一个玩具。

 

 

起初,比尔的灵运行于水上。

 

比尔说要有DOS,于是就有了DOS

 

……

 

第八天,比尔说要有VB,于是就创造出了VB。

 

                                                《 3S 新约第一章》

 

 

 

深度下潜

 

 

 

 

 

你需要一套不错的潜水服(VB6.0企业版,你不会说你没有吧,其实我只有D版的,呵呵)一个潜水镜(VC6.0所带的OleView),当然你还得有较好的游泳技术(坚实的COM技术和C/C++功底,不过我也不是很好),然而最重要的是,你可以忍受这次痛苦的经历。如果你是PLMM,可以直接与我联系,我会来保护你安全,呵呵。

Everybody ,ok? Lets go

 

 

 

第一天

下潜深度(一米,水温0°C),时间北京时间零点整。

 

“大家好!我是这次探险的队长BlueDog,其实我并不是情圣,呵呵,虽然很多MM都把我当作梦中情人。”

“你们都不舒服么,为什么大家都在呕吐,噢,我知道了,这很正常么,是晕船呀。”

“呯!”

。。。。。。。

好了,费话少说。拿出你们的JJ(操,我是指你的机器,电脑,计算机,懂不懂!)

打开一个VB工程,建一个标准的EXE。接下来的,我们需要使用到VB的指针,当我的话没有说完的时候,一只蚊子嗡嗡的说:“老大,VB中可没有指针呀”。

“啪”,世界清静了!

“我最不喜欢有人打断我的讲话了,哼!”

对了,在下水之前,我还没有发给你们一个很重要的装备氧气瓶(3S Ole TypeLib),这是居家旅行,杀人灭口的必备利器。

“哪里有得买呢?”

http://www.xtcz.net/bbs/dispbbs.asp?boardid=8&id=1096

你下载后,需要解压,你后你会得到一个3SoleLib.tlb的文件,此文件是美国进口,中国贴牌生产的。所以使用此文件我不保证没有任何官司缠身。至少如果你用于商业软件,你得请我吃当地的大排档一次,作为你的使用费。

然后用最经典的DOS命令

copy c:/3solelib.tlb c:/windows/system32

 

好了,你然后在你新建的工程中选择 工程->引用 ,引用这个文件,不会用,去死吧。

然后是不是发生了很奇妙的事情???

没有,晕,老大,你按F2看看,是不是多了一个 olelib的东东

不知道?去死吧,受我一记极度冰冻拳。

有什么用?好,我来告诉你有什么用。

以前,你写个API是不是要用Declare之类的东东,现在用不着了,你可以直接使用这个API了,至少对于大部分的与COM有关的API是这样子的了。(具体的原因以后进行说明)

如果你真的不懂也不紧,谁叫你是郭靖呢。我们需要里面一个很重要的东东,你在对象浏缆器中可以查找MoveMemory,是不是可以找到以下相关的定义。

Sub MoveMemory(pDest As Any, pSource As Any, ByteLen As Long)

 

这便是我们今天所要找的东东。

下面我们在一个Form上加一个按钮。然后在CODE界面录入

Private Sub Command1_Click()

 

  Dim i As Long

 

  Dim j As Long

 

 

 

i = 3

 

  j = 4

 

 

 

  MoveMemory ByVal Varptr(i), ByVal VarPtr(j), 4

 

 

 

  Debug.Print i, j

 

End Sub

 

运行,看看,发生了什么。I的值也变成了4 ,这是真的。神呀。一定发生了什么。让我们来看看倒底发生了什么。

 首先我们看到Varptr,老师告诉我们有问题问MSDN,但是MSDN没告诉我们。到GOOGLE查一查,好多不多,原来是取变量的地址。再到VB的对象浏缆器中找找,打开显示隐含成员,然后再查找,VB会显示

Function VarPtr(Ptr As Any) As Long

 

    VBA._HiddenModule 的成员

 

比尔在这里隐藏了这个东东,在它的附近有ObjPtr、StrPtr,它们又是作什么用的呢,简单的说Objptr是取对象地址,StrPtr是取字符串地址的。这两个东东明天再谈。

那么,另一个MoveMemory又是什么?来看看MSDN的原文

The MoveMemory function moves a block of memory from one location to another.

VOID MoveMemory (

 

  PVOID Destination,  // address of move destination

 

  CONST VOID *Source, // address of block to move

 

  DWORD Length        // size, in bytes, of block to move

 

);

 

对于梵文不好的同学,我给大家翻译一下(“MoveMemory这个函数的作用是将一堆钱从一个口袋移到另一个口袋,)好,太好了,那么要是写上

 

Movemoney(mybag,bossbag,1000000000000)

 

大哥,看清点是Memory不是money!

那么,

就只能将一块内存的数据搬到另一块内存

是这样。

其实很早以前,美国的高手风清杨同志(Bruce McKinney)就搞出了这个东东,让VB门人也可以象C门人一样练葵花宝典而不用自宫。实在是我等之大幸。不过他重新定义成CopyMemory,实际上Windows API中是没有这个东东的。

 

 

好了,笑话少说,看看上面那行代码是什么意思

MoveMemory ByVal Varptr(i), ByVal VarPtr(j), 4

 

是不是指从 j 处移到 4个字节(long型)到 I 处。

Excellent ,不过你还有一个地方没注意,为什么我要用 Byval 而不用 Byref

不信,你用

MoveMemory VarPtr(i), VarPtr(j), 4 这行代码来代替上面那行,再运行一下,

山还是那座山,I 还是等于 3 ,所以我们还要来仔细研读MoveMemory在氧气瓶里的定义

Sub MoveMemory(pDest As Any, pSource As Any, ByteLen As Long)

 

看出来没有,在VB中

指定 As Any 来禁止类型检查,从而允许将任意数据类型传递给该过程

 

那么如果我们用Byval时,传的就是j的地址值。

 

而用byref 传的就是储存 j的地址值的临时变量的地址值(为什么这么拗口呀)

 

明白?

 

如果你不明白,正是所谓的资质有限,呵呵,不怪你。

 

这位同学又说了,那要是这样,我不直接用

 

MoveMemory i, j, 4

 

就好了,何必这么麻烦。聪明,你看看人家的理解能力。

 

不过我只是为了告诉大家varptr是如何用的而已。

 

另一个同学就说了,其实还有更简单的

 

I=j

 

猪。

 

这时候深度计显示已达到一米,一个同学惊呼,“不明生物来袭”。。。。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.NET String底层原理:不可变性、驻留机制与性能优化 String是.NET中最基础却最易被误解的类型,其本质并非简单字符数组,而是具备不可变性(Immutability)和字符串驻留(Interning)特性的托管对象。这种设计源于CLR对内存安全与并发一致性的权衡:不可变性避免共享引用下的竞态问题,驻留机制通过全局哈希表复用常量字符串以减少堆压力。技术价值体现在零锁并发、编译期优化(ldstr指令)和GC友好性上;典型应用场景包括高频日志拼接、微服务参数比对、配置键字典查找及JSON反序列化后处理。本文深入IL层与托管堆视角,解析string与System 阅读详情

相关推荐

VB6程序中验证ByREF, ByVal, VarPtr, StrPtr, Poke, Peek, DBCS, SBCS, Ansi, Unicode的区别与使用

字符串存储格式影响着编程使用,C格式字符串是以 \0 作为结束符,其长度可以由此计算,而VB格式的字符串其长度存于字符串前缀之中。不仅如此,字符串编码方式 ansi, unicode, widestring, dbcs, sbcs 这些概念也影响着长度计算。笔记用VB6程序对它们进行剖析验证。

weixin_45707491的博客 1304

vb 指针的操作

VB指针教程1 '先理解下变量的地址与指向这个地址的值。xx省xx市xx街xx号就是一个地址, '指向这个地址的值就是这个地址就有什么。比如这个地址是张三家的地址, '张三的家有什么呢?这个有什么就是这个地址所指向的值。 'VB没用操作指针的语言特性,因此需要通过WinAPI函数来进行操作,下面我们将 '演示一个非常简单的指针操作,让大家在VB使用指针有个基本的了解。

tangyanzhi1111的专栏 3662

VB程序运行时显示 ocx 控件的属性页的方法

这篇文章只是回答优快云网友standys2004提出的问题的,所以,您大可以略过不看 首先,COM对象如果要支持属性页特性,那么它必须实现ISpecifyPropertyPages接口,同样我们只要实现了ISpecifyPropertyPages接口,就可以显示属性页,在vb中实现ISpecifyPropertyPages接口需要我们了解ODL语言,编好ODL文件后,再编译为TLB文件,这里,我

rainstormmaster的专栏 5054

vb-跨域访问网页最简单方法,获得特定的frame进行处理

vb-跨域访问网页最简单方法,获得特定的frame进行处理 以下三种方法所用时间为130,82,28 微秒(一秒=100万微秒,=1000毫秒,1毫秒=1000微秒)

3644

VB公农历1.02版,不需要任何DLL

建一个Form1,然后添加一个CommandButton,贴上以下代码做测试。Option ExplicitPrivate Sub Command1_Click()   Dim t As clsDate   Dim y As Long   Dim m As Long   Dim d As Long   Dim st As Single   Dim et As Single   Dim da As

BlueDog专栏 4656

vb.rar_OLElib2.tlb_vb olelib.tlb_vb olelib2.tlb_visual basic

vb中接口的使用!完整源码。下载后请保留信息

今夜,多少VB程序员在“随想”

从这个地址(http://info.tlw.cn/8223.htm),我看到了跟我一样的一个VB程序员的所谓随想。作者可能还学习了C,但像我这样以VB起步、非计算机专业的人来说,对VB就有更多想法。或者VB是引我们进入编程世界的大功臣和初恋情人,但流言裴语使我们无法不分心,便空多了几分惆怅。有时就想,我们(因为肯定不只我一个人)到底是对VB不相信,还是对自己不相信呢?我看过AdamBear的书

青春,在燃烧吗? 1055

VB_API免声明(Win32Api.tlb_3432个函数包括参数常量和数据类型结构体)

Win32Api.tlb是一个静态库文件,集合了很多API函数,以后VB不用声明API函数了,向内部函数一样使用API函数

VB6实现界面与功能代码分离

在网页看到过纯理论的文章,在摸索了N久之后,终于用VB6实现。 1、找一个olelib.tlb的文件,网上有下。2、新建VB工程,加入webbrowser控件,引用上面的文件。3、FORM1上加上WebBrowser1。切换至代码。4、窗体代码(PS:代码我一律不解释。)Option ExplicitImplements IDocHostUIHandlerDim msh

vansoft - 助人乃快乐之本 5405

Triton推理服务器实战:如何为PaddleOCR的ONNX模型配置动态批处理和并发推理

本文详细介绍了如何使用Triton推理服务器为PaddleOCR的ONNX模型配置动态批处理和并发推理,以提升GPU利用率和推理性能。通过实战案例和参数调优指南,帮助开发者解决高并发场景下的性能瓶颈问题,实现从实验室到生产环境的高效部署。

weixin_42527160的博客 426

Tomcat源码:Acceptor与Poller、PollerEvent

前文中我们介绍到NioEndpoint的start方法启动了Acceptor与Poller这两个异步线程来处理连接请求,本文我们就来接着介绍这两个组件。目录前言一、Acceptor1、构造方法2、run方法LimitLatchNioChannel二、Poller与PollerEvent2、pollerregisterruneventsprocessKey。

CRUD工程师 2065

More Faster , More VB User

More Faster , More VB User                                        ——VB位操作 为什么VB中不加入位操作的语法元素,我想主要是比尔的电脑比大多数人的电脑要快上几百倍。他可能觉得已经够了。                                        —— Llib.Setag   

BlueDog专栏 2360

Greenplum基础

CREATE DATABASE 是 SQL 命令,用于创建一个新的数据库。name 是你要创建的数据库的名称。这个名称是必须的,并且在同一个数据库服务器上必须是唯一的。可选项,OWNER 指定了新数据库的所有者,如果未指定,新数据库的所有者默认是执行该命令的用户。dbowner 是数据库所有者的用户名。可选项,TEMPLATE 指定了用于创建新数据库的模板。在 PostgreSQL 和 GreenPlum 中,通常有一个名为 template1 的默认模板。如果不指定,就会使用这个默认模板。

m0_57697768的博客 1206

VB 中 copymemory的有关问题

dim a() as long dim b() as bytecopymemory b(0),byval "1234",4 copymemory byval varptr(a(0)),1234,4在 VB 中处于安全考虑,不能直接访问内存,但你可以使用 CopyMemory(RtlMoveMemory) 的 API 来复制指定区域的内存,其具体声明如下:Declare Sub Copy...

demonzsmj12315的博客 501

阿里云大模型ACP认证模拟考试(三)

【摘要】:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。

davidkorhenn的博客 3580

boost::circular_buffer缓行缓冲区

1、circular_buffer实现了一个环形缓冲区,空间大小是固定的,当到达容器末尾时,将自动利用容器另一端的位置空间。 2、当程序需要容纳大量的元素,但多数情况下仅保存较少数量元素时可以使用circular_buffer_space_optimized,他可以有效的减少内存的占用,提高程序的运行效率。 3、主要接口: 4、实现一个生产者---消费者模式示例: #inc...

小米的修行之路 791

快速加载文件到流对象

(声明:魏滔序原创,转贴请注明出处。)引用olelib.tlb (可以从http://www.mvps.org/emorcillo/download/vb6/tl_ole.zip下载) Global Memory FlagsPrivate Const GMEM_MOVEABLE = &H2Private Const GMEM_ZEROINIT = &H40Private Const GENERI

迈克揉索芙特 2099

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型

一、本文介绍 本文记录的是基于 GhostNetV3 的 YOLOv11 轻量化改进方法研究。GhostNetV3的轻量模块采用重参数化方法,训练时为深度可分离卷积和1×1卷积添加线性并行分支,推理时通过逆重参数化移除分支、折叠操作,能够在不增加推理成本的同时提高性能,从而实现YOLOv11的轻量化改进。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进 专栏地址:YOLOv11改进专栏——以发表论文的角度,快速

Limiiiing的博客 1845

RichTextBox插入.gif图片

转载 实际上还可以嵌入其他组件,比如Windows Media Player等,下面以比较成熟的QQ的ImageOle为例。 需要组件: ImageOle.dll   在QQ的目录下找,如果非XP系统则还需要GdiPlus.dll。 OleLib.tlb         下载地址:http://www.mvps.org/emorcillo/download/vb6/tl_ole.zi

shaxunyeman的专栏 1806

173、NPU的编译器开发:开源社区贡献指南

本文分享了在NPU编译器开源社区贡献的经验心得。作者通过实际案例(如卷积维度错误、NaN输出等)阐述了NPU编译器开发的特殊性:硬件迭代快、边界条件复杂、厂商代码不可全信。提出有价值的贡献应聚焦硬件适配测试、性能剖析工具和反模式文档三类内容。强调用实测数据沟通、主动承担维护责任、保持代码通用性等社区协作技巧,并建议通过RFC提前沟通、附硬件实测数据等方式提高PR通过率。最后指出,NPU编译器开发是与聪明人共同填坑的过程,鼓励开发者提交"有诚意的代码"而非完美代码。

m0_50546716的博客 35

Node-RED系列(二九):使用slider与chart节点来实现双折线时间序列图

今天教使用dashboard的chart组件和slider组件来是实现一个双线的折线图。效果如下 拖动顶部的电量和水量,低下的图表会实时显示时间和值之所以做这个模拟案例,是将教 大家使用chart节点和slider节点先说一下slider节点,该节点是一个滑块节点,可以接受上一节点的 msg.payload,作为滑块的值, slider必须设置最大值和最小值。且不能动态设置。 此外当用户拖动slider滑块,改变值时,该节点会向下传递当前值 以属性payload装载。在说一下chart节点,该节点可以用于

知无涯 4967

VB如何更新

更新内容格式: 最新版本=版 5.30本结 下载地址=地 http://ys-f.ys168.com/614864239/UIVsg9u551H674556PG3/%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B05.3.exe址结 下载方式=方 打开网页或下载文件。式结 更新说明:1.土豆2.好的3.BL2CK4.測試更新。说结 ...

qq_40621901的博客 688

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

vb.net实现Vb中的Any变体类型

今天无意中发现可以vb.net教程 替代VB中的Any 在API声明中可以使用<MarshalAs(UnmanagedType.AsAny)> VB中声明c#教程的API 1 Declare Function SendMessage& Lib “user32” Alias “SendMessageA” (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) 在vb.net可以这样pytho

chinaherolts2008的博客 804

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB中实现GIF嵌入到RichTextBox

(声明:魏滔序原创,转贴请注明出处。) 实际上还可以嵌入其他组件,比如Windows Media Player等,下面以比较成熟的QQ的ImageOle为例。需要组件:ImageOle.dll   在QQ的目录下找,如果非XP系统则还需要GdiPlus.dll。OleLib.tlb         下载地址:http://www.mvps.org/emorcillo/download/vb6/tl

迈克揉索芙特 3931

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TLB是什么?

TLB是OLE库文件,其中存放了OLE自动化对象的数据类型、模块和接口定义,自动化服务器通过TLB文件就能了解自动化对象的使用方法。      TLB是一种OLE(或ActiveX)定义文件,它包括常数、接口(Interface)、类等的定义。你可以在VB的集成环境的 Project|Reference中将

oucC229的专栏 3575
上一篇: VB公农历1.02版,不需要任何DLL
下一篇: VB 深度下潜之 海蛇缠绕
BlueDog
博客等级 码龄27年 104粉丝 62原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值