现在我遇到一个比较头痛的难题:
已知一个程序是Delphi开发的,现在我想去读取那个Delphi窗体上的控件,因为那个Delphi很早前开发的,没有源代码,而且那个程序在调本身的一个DLL的时候没有传递Application指针过来,我现在有那个DLL的代码,想把这个DLL修改一下,去读取主窗体上的一些控件属性,可因为没有Application指针,而通过API我只能找到窗体句柄,现在一般的Edit什么的我可以通过消息什么的获取内容,可DBGrid呢,我怎么才可以获取DBGrid的内容呢?

解决方案 »

  1.   

    DLL里引用Forms
    然后
    ShowMessages(Application.ExeName);
    试试。:))
      

  2.   

    dbgrid的数据源中的数据都已经读到本地内存的。。你看看去分析一下。。呵呵 具体的 偶也想知道 ^_^
      

  3.   

    直接在DLL中引用Forms,虽然Application全局变量有了,但此Application和Exe的Application是不一样的,所以一般写DLL的Application要从Exe的Application传过来,这样才可以操作MainForm。现在这个EXE的DBGrid的数据来源,我是不知道了,要是去分析,代价实在太大了!我原先的想法,是能通过API找到Form的Handle值,接着查找内存中该值的位置,根据VCL的类的内存布局,找到TMainForm的类的起始位置(应该就是引用类的位置),不知道这样行不行。我不知道windows是如何控制DBGrid表现的,是什么消息吗?如果哪位高人知道,还望给我讲解讲解,我另外开帖子给分。
      

  4.   

    可以查找到form上的dbgrid组件,form.controls[I].classname='TDBGrid'然后用 TDBGrid(form.controls[I])操作,想做什么就做什么。如果form.controls[I]不行就用form.componets[I]
      

  5.   

    是form.components,写错了,不好意思
      

  6.   

    由于Exe的application没有传过来,我只能通过api找到Form的handle,怎么可以得到类呢???
      

  7.   

    那就通过findwindowex找到dbgrid的handle,然后给dbgrid下个钩子好了
      

  8.   

    谁对windows机制比较熟悉,能不能给出个注意啊?