又没有办法枚举一个dll中窗体的控件列表、
这个dll包含一个窗体,导出函数我也知道。
但是只能知道这个函数,调用此函数,dll中
的窗体便show出来了,此dll也是delphi所写。
请问哪位知道怎么才能枚举?应该能枚举的,我手头有一个无源的程序,调用此
dll后,就能把这个dll窗体中的button全部枚举出来
包括这些button的名称,caption等。

解决方案 »

  1.   

    枚举窗口中的控件for i := 0 to Form1.ComponentCount - 1 do
    begin   
      ShowMessage(Form1.Components[i].Name);  
    end;
      

  2.   

    Windows API : EnumChildWindows
      

  3.   

    首先要获取dll中窗体的句柄,然后强制类型转换为TForm就可以采用循环方式枚举该窗体的控件;
      

  4.   

    补充楼上,获取窗口句柄后要FindControl才能把句柄转化成对象
      

  5.   

    FindControl去查找Dll中的窗体?试试看吧。我想你是找不到的。知道为什么吗?去看FindControl的源码。
    (其实就是hInstance不同造成的)
      

  6.   

    觉得,楼主应该在DLL中做文章!把某些信息放出来,然后外部就可以查找了
      

  7.   

    如果这个dll是用delphi写的,而且是使用TFrom,那么这个dll的资源里应该包含该窗口的dfm文件内容,
    用LoadResource把dfm信息读出来就可以了
      

  8.   

    dfm包含窗体所有控件的信息,甚至包括图片。采用类似下面的格式:object Form1: TForm1
      Left = 192
      Top = 114
      Width = 574
      Height = 392
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13  object Button1: TButton
        Left = 160
        Top = 96
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 0
      end  object Memo1: TMemo
        Left = 64
        Top = 160
        Width = 185
        Height = 89
        Lines.Strings = (
          'this is a sample')
        TabOrder = 1
      end
    end
    动态生成的窗口和直接通过api生成的窗口不能通过这个方法。
      

  9.   

    普通的窗体遍历过,不知道Dll出来的是不是也一样。
    EnumChildWindows(Hwnd, @buildFormInfo, 0);
    Hwnd是要遍历的窗口句柄。function buildFormInfo(AhWnd: HWND; AlParam: lParam): boolean; stdcall;
    var bufClassName: array[0..255] of Char;
      findClassName: string;
    begin
      GetClassName(AhWnd, bufClassName, 255);
      findClassName := StrPas(bufClassName);
      showmessage('控件句柄:::' + inttostr(AhWnd) + ':::类名:::' + findClassName );
      Result := True;
    end;