问个问题
我写了个主程序FORM1 当打开指定程序后 按F8键可以呼出Frm(我是通过键盘HOOK,注入到指定程序中),现在就想问1个公共变量问题我在主程序Form1中 有个数字要保存到变量中,但子窗体Frm如何能调用到那变量呢,

解决方案 »

  1.   

    看可不可以这样:
    1.到Frm中Uses Form1;
    2.在Form1的Public 里写个全局变量比如i:integer;
    3.然后在Frm的任意位置以指定窗体的形式调用如  showmessage(inttostr(form1.i));
      

  2.   

    或者这样,注意变量s:type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        i:integer;
      end;  var s:string;var
      Form1: TForm1;implementationuses Unit2;
    ......
    然后在窗体Frm中:unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm2 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  var
      Form2: TForm2;implementationuses Unit1;//----------uses进来{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
    begin
      showmessage(inttostr(form1.i));
      showmessage(s);
    end;end.
      

  3.   

    Use不了Form1  Frm是包含在DLL里的 而 FROM是独立的
      

  4.   

    在FRM中已经Use了 个HOOK的UNIT
      

  5.   

    那就使用windows消息试下,或者保存在文件
      

  6.   

    不同的dll,是不能直接訪問內部變量,除非export一個訪問接口。還有一個方法是:將主程序裡的變量的值同步到子程序裡(一有變化),通過WM_CopyData可實現
      

  7.   

    好像不能全局,可以通过消息或者写文件,
    如果消息量很大也可以开一个临时的内部socket。
      

  8.   

    在public处定义变量,然后,引用这个单元就可以了
    也可以将变量放在一个.Pas文件中,在作到变量的时候,引用这个文件
      

  9.   

    如果这个dll与主程序在一个进程空间内
    dll中加入下面的函数
    var
      abc PInteger;
    procedure Init(var pub_int integer);
    begin
      abc=@pub_int;
    end;
    主程序在装载dll后就调用其的init函数,并传入那个变量。
    使用的时候a=abc^就可以了