vb一直以来被认为有以下优缺点:优点是上手快.开发效率高;缺点是能力有限,运行效率低.vb被其它语言的拥护者诟病的有很多,不支持指针,不支持重载,不支持内联汇编等等等等.当我们享受着vb的简单时,却发现我们的发挥空间越来越小.的确,简单与功能强大这两者本身就是一对矛盾.那怕一行代码不写,仅仅起动运行一个空窗体这样简单动作,vb在底下就为我们做了大量复杂的工作(决不仅仅是注册窗口类.显示窗口.起动消息循环这么简单),而这些工作对程序员来说是透明的.
好了,开始吧!我们需要的软件,vb6+sp6,反编译软件w32dsm89(vc也行);相关知识:熟悉vb,最好知道c语言中的指针,堆栈,当然,不懂也不要紧,相关知识笔者都会一一给出解释的. 【程序编程相关:定制你文件夹的新图标】 由于本人的水平有限,以及相关硬件的制约(我的台式电脑cpu还是pii450,只能装win2000),以下的结论没特殊声明只对win2000有效. 【推荐阅读:捆绑MAC和IP地址 】 1.copymemory 【扩展信息:Windows 2000/NT一些命令的】一.基本概念如copymemory的声明,它是定义在kernel32.dll中的rtlmovememory这个api,32位c函数库中的memcpy就是这个api的包装.它的功能是将从source指针所指处开始的长度为length的内存拷贝到destination所指的内存处.它不会管我们的程序有没有读写该内存所应有的权限,一但它想读写被系统所保护的内存时,我们就会得到著名的access violation fault(内存越权访问错误),甚至会引起更著名的general protection (gp) fault(通用保护错误) .所以,在进行本系列文章里的实验时,请注意随时保存你的程序文件,在vb集成环境中将"工具"->"选项"中的"环境"选项卡里的"启动程序时"设为"保存改变",并记住在"立即"窗口中执行危险代码之前一定要保存我们的工作成果.2.vatptr/strptr
它们是vb提供给我们的宝贝,它们是vba函数库中的隐藏函数.varptr返回的是变量的地址,strptr返回的是bstr指向的unicode字符数组的地址.下面详细阐述一下bstr.假设变量str位于地址aaaa处,而这个字符数组在地址xxxx处,它是变量str的内容.为了看到以下的内容: varptr=aaaa strptr=xxxx我们只要运行以下的代码: dim lng as long dim i as integer dim s as string dim b(1 to 10) as byte dim sp as long, vp as long s=”help” sp=strptr(s) debug.print “strptr:” & sp vp=varptr(s) debug.print “varptr:” & vp‘验证vp=aaaa与sp=xxxx
copymemory lng,byval vp,4 debug.print lng=sp ‘查看sp包含的字符数组的地址,从那个地址复制一个字节数组然后打印 copymemory b(1),byval sp,10 for i=1 to 10 debug.print b(i) next i输出结果是:
strptr=xxxx varptr=aaaa true 104 0 101 0 108 0 112 0 0 0为什么要隐藏vatptr/strptr?因为vb开发小组不鼓励我们用指针.以下就是varptr函数在c与汇编语言里的样子:
在c里样子是这样的: long varptr(void* pv){ return (long)pv; } 所对就的汇编代码就两行: mov eax,dword ptr [esp+4] ret 4 ´弹出栈里参数的值并返回.之所以让大家了解varptr的具体实现,是想告诉大家它的开销并不大,因为它们不过两条指令,即使加上参数赋值.压栈与调用指令,整个获取指针的过程也就六条指令.当然,同样的功能在c语言里,由于语言的直接支持,仅需要一条指令即可.... 下一页