分类: Delphi
2011-02-26 00:36:55
话一:
曾经看过一些文章里大言不惭的写着,“不是VB6不支持指针,而是你水平太低”,接着还会告诉你用VarPtr获取变量地址,再用RtlMoveMemory函数来使用变量地址赋值。
我不得不说,此话的作者肯定是VB6的终极fans。为什么?两点原因:
1、此话作者对VB6的驾驭显得驾轻就熟,令我望其项背。
2、此话作者对指针的认识着实无法无天,令我极其汗颜。
为什么如此说呢?
首先,此类做法的确可以模拟个指针操作出来。其次,这样的操作效率能和指针的操作效率相提并论吗?实为照虎画猫,画蛇添足之作。
因而,坦然的说,不要迷恋所谓的无所不能,而要相信马克思前辈的客观唯物。
话二:
曾经看过一些VB6写外挂的同志用到一个名叫“clsAsm”的VB6类,用来实现VB6.0内嵌汇编。
原理如何呢?将一段汇编指令机器码写入内存,然后转交指令控制权于此段机器码开端,然后,这段机器码就得以执行了,当然这中间还需要对进行栈的维护和最终的RET。
此法很高明,可以通过内嵌汇编来高效执行一些代码。但,此法亦不足为效。
原因有二:
1、这个汇编类可以执行的汇编指令少的可怜,虽然可以扩充,也是一件很麻烦的事情,稍不留神就出错。
2、这个汇编类只是简单的顺序流程汇编指令序列。对于高级的内嵌汇编而言,简直是一无是处。再想想,如果这个汇编类真的很高明,人们还有必要去用汇编编译器么?
相对而言,VC6.0的内嵌汇编类则高明多了。这是由它的编译机制决定的。
俗话说,工具是死的,人是活的。我们不需要去照着虎模拟一个猫,而是需要选择恰当的东西做恰当的事。
最后,附上自己写的简单VB6.0内嵌汇编类。如果有兴趣,可以直接用Emit方法通过16进制机器码扩充此类或者直接使用机器码。但是上面已经说过了,不推荐。