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

本文深入探讨了VB的不寻常应用。作者抛开VB普通应用,深入COM领域。介绍了借助VB6.0企业版、OleView等工具,通过特定操作引用3S Ole TypeLib文件,利用VB指针和MoveMemory函数实现内存数据移动,还讲解了Varptr等函数的作用及使用要点。

 

 

 

本来我也是非常赞同网上一个流行的观点,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 的成员

 

比尔在这里隐藏了这个东东,在它的附近有ObjPtrStrPtr,它们又是作什么用的呢,简单的说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

 

猪。

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

内容概要:本文围绕“新型电力系统下多分布式电源接入配电网承载力评估方法”的研究,系统性地介绍了基于Matlab的仿真建模与代码实现方案,旨在评估高比例分布式电源(如光伏、风电等)接入背景下配电网的接纳能力。研究融合了智能优化算法(如蜣螂优化、灰狼优化、遗传算法)、多目标优化、鲁棒优化及双层优化模型,结合潮流计算、稳定性分析与故障仿真,构建了完整的承载力评估体系。文档不仅提供核心算法实现,还拓展至微电网调度、储能配置、电氢耦合系统、电动汽车协同等前沿方向,强调“复现+创新”相结合的科研路径,助力研究者快速掌握高水平论文复现技巧并激发原创思路。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,正在从事科研或工程应用的研究生及初级科研人员(工作1-3年);; 使用场景及目标:①复现高水平期刊中关于配电网承载力的优化模型;②开展高比例可再生能源接入下的配电网规划与运行研究;③学习并应用智能优化算法解决复杂电力系统问题;④获取完整科研资源包以加速课题进展与论文撰写; 阅读建议:建议读者关注公众号“荔枝科研社”获取网盘资源,下载全套代码与模型文件,按照文档结构循序渐进学习,重点理解算法设计逻辑与仿真建模细节,结合所提供的复现案例深化对优化模型与工程应用场景的理解,提升科研效率与创新能力。
内容概要:本文系统研究了综合能源系统中的容量配置与运行调度问题,采用双层优化方法构建模型并通过Matlab代码实现求解。上层优化侧重于设备容量的科学配置,以降低投资成本并提升系统经济性;下层优化聚焦于多能源协同运行调度,综合考虑光伏、储能、电动汽车等多种能源形式的动态特性,旨在实现系统在不同运行工况下的能效最大化、运行可靠性与低碳化目标。研究融合智能优化算法(如遗传算法、粒子群算法)与电力系统建模技术,深入探讨了多能耦合、不确定性处理及复杂约束下的优化机制,并提供了完整的仿真案例与代码资源,涵盖微电网调度、风光储协同、电动汽车接入等典型应用场景,形成了具有较强实用价值的科研技术体系。; 适合人群:具备电力系统分析、优化算法理论及Matlab编程基础的研究生、科研人员和工程技术人员,特别适用于从事综合能源系统规划、微电网运行、智能调度与能源互联网等领域研究的专业人士。; 使用场景及目标:① 掌握双层优化在综合能源系统中的建模方法与求解流程;② 利用所提供Matlab代码进行科研复现、算法改进与系统仿真验证;③ 拓展应用于电动汽车集群调度、可再生能源消纳、多能互补系统优化等实际工程与学术研究场景; 阅读建议:建议结合文档中列出的相关研究方向与配套代码资源,按照主题分类循序渐进地学习,优先理解双层架构的设计逻辑与上下层耦合机制,并借助提供的网盘资料开展仿真实验与参数调试,以深化对优化模型与算法实现的理解,提升科研创新能力。
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值