我目前在开发的一个项目中,有一个主程序EXE,各个模块用DLL调用,我现在定义了一个TGLOBLE.PAS文件,
   专门用来存储全局变量,在每个模块的DLL中,我USES 了TGLOBLE,在需要用到全局变量的窗口中,我也USES
   了TGLOBLE;我给TGLOBLE中的全局变量赋值了,但是就是在调用全局变量值的时候,该值为空。不知道为什么?

解决方案 »

  1.   

    我目前在开发的一个项目中,有一个主程序EXE,各个模块用DLL调用,我现在定义了一个TGLOBLE.PAS文件,
       专门用来存储全局变量,在每个模块的DLL中,我USES 了TGLOBLE,在需要用到全局变量的窗口中,我也USES
       了TGLOBLE;我给TGLOBLE中的全局变量赋值了,但是就是在调用全局变量值的时候,该值为空。不知道为什么?
      

  2.   

    第一,如果你调用的是自定义结构的全局变量必须在.pas里声明
    第二,看看有没有类型转换的问题。比如在Delphi里调用DLL里字符串类型的变量需要用PChar。
      

  3.   

    在同一个工程内引用统一个单元是共享数据的。
    但是,在不同的工程中引用统一个单元就不能共享数据了,而是在每个工程中都有一份这样的数据,而且互相没有任何关系。
    注意:每个dll都是一个新的工程。
      

  4.   

    应该在主程序和各DLL之间传递全局变量
      

  5.   

    给你一个例子:主程序和dll之间的参数传递:主程序代码:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure pro_click(sender:TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      jk_handle:Thandle;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
      pro_click(self);
    end;procedure TForm1.pro_click(Sender: TObject);
    var
     ls_menu:string;
     jk:procedure (cs_gzbh,cs_xm,cs_bmfs:string);stdcall;
        // 传递参数:工作编号,姓名,编码方式
    begin    jk_handle:=loadlibrary(pchar('new'));
        if jk_handle<=0 then // 不存在DLL
        begin
          Application.messagebox('动态链接库加载失败!','提示',64);
          exit;
        end
        else // 存在DLL
        begin
          try
            @jk:=GetprocAddress(jk_handle,'jk_cscd');
            jk('1','2','3');
          except
            Application.messagebox('动态链接库加载失败!','提示',64);
            exit;
          end; // end of except
        end;
    end;end.//////////////////////////////////////////////调用的new.dll的代码:
    library new;uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1};{$R *.RES}
    exports
      jk_cscd;//传入gzbh,接口过程begin
      {Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;}
    end.
    _______________________________________unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Label1: TLabel;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      procedure jk_create;// 建立表单
      procedure jk_free;  // 释放表单
      procedure jk_cscd(cs_gzbh:string;cs_xm:string;cs_bmfs:string);stdcall;implementation{$R *.DFM}
    procedure jk_create;//建立表单
    begin
      Application.CreateForm(Tform1, form1);
    end;procedure  jk_free;//释放表单
    begin
      if assigned(form1) then form1.Free;
    end;procedure jk_cscd(cs_gzbh,cs_xm,cs_bmfs:string);stdcall;
    begin
     try
      jk_create;
      form1.Label1.Caption:=cs_gzbh+','+cs_xm+','+cs_bmfs;
      form1.ShowModal;
      finally
      jk_free;
      end;
    end;
    end.
     
    自己研究吧!!!
                 ------进步才是硬道理[email protected]