假设有一个别人的EXE应用(无源码)使用了 VirtualTreeview 控件,我通过Hook获得了这个对象实例句柄,此时有没有什么方法能够得知这个EXE应用在编译时,使用的是什么版本的 VirtualTreeview ?换一个说法:就是 VirtualTreeview 对象在运行时有没有办法输出一个版本号(或能识别其版本的信息)?一般的VCL控件可以吗?

解决方案 »

  1.   

    一般的VCL控件是自己定义一个属性或方法,返回自己的一个版本号的常量
      

  2.   

    哦。vt是定义了一个全局的常量:const
      VTVersion = '4.8.6';
      VTTreeStreamVersion = 2;
      VTHeaderStreamVersion = 6;    // The header needs an own stream version to indicate changes only relevant to the header. 
      

  3.   


    是的,但这个无法解决“如何辨别已有应用的vt里的版本号”的问题。另外,vt开源,目标应用的作者要是稍微自定义更改了类的属性、方法,那把所有vt发布过的版本都装一遍去试,也对不上。定义变了,对象内存布局也变化,即使用Hook中定义的vt变量去指向获得的目标应用中的对象地址,虽然首地址一样,但hook中定义的vt的内存结构与目标应用中不同(除了TControl等父类的相同,vt自己的属性方法就有不同了),调用就肯能出错了。
    我的目的只是想运行目标应用中vt的某个方法,比如selectAll,不知有何方法可实现?