我在Package中定义了一个方法和过程,怎么在其他程序调用这个方法和过程,如果是类了?在线等待... ...

解决方案 »

  1.   

    我再来:一、在包中新建一个窗体单元,提供输出的函数,过程。
    unit frmDemo;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TDemoForm = class(TForm)
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      
    {声明函数和过程}
    procedure SayHello;stdcall;
    function  Add(a1,a2:Integer):Integer;stdcall;{导出函数和过程}
    exports
      SayHello,
      Add;
    var
      DemoForm: TDemoForm;implementation{$R *.dfm}
    procedure SayHello;
    begin
       ShowMessage('你好!');
    end;function Add(a1,a2:Integer):Integer;
    begin
       Result:=a1+a2;
    end;procedure TDemoForm.Button1Click(Sender: TObject);
    begin
       Self.close;
    end;initialization
       RegisterClass(TDemoForm);
    finalization
       UnRegisterClass(TDemoForm);
    end.
      

  2.   

    接上,
    二、在主程序中调用包中的对象以及函数过程
    具体见代码如下:
    unit Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, DBGrids, DB,ADODB;type
      TMainForm = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        private
        { Private declarations }
        PackageModule: HModule;
      public
        { Public declarations }
      end;
      {声明函数和过程}
      TAddFunc = function(a1,a2:Integer):Integer;stdcall;
      TSayHelloProc = procedure;stdcall;
    var
      MainForm: TMainForm;implementation
    uses
      DemoClassInt;
    {$R *.dfm}procedure TMainForm.FormCreate(Sender: TObject);
    begin
       try
          PackageModule:=LoadPackage('DemoPackage.bpl')
       except
          On E:Exception do
          begin
            MessageBeep(Word(-1));
            ShowMessage(E.Message);
            Application.Terminate;
          end;
       end;
    end;procedure TMainForm.FormDestroy(Sender: TObject);
    begin
       if PackageModule <> 0 then
          UnloadPackage(PackageModule);
    end;{Package中函数的调用}
    procedure TMainForm.Button1Click(Sender: TObject);
    var
       AddFunc:TAddfunc;
       value:Integer;
       a1,a2:Integer;
    begin
       @AddFunc:=GetProcAddress(PackageModule,PChar('Add'));
       if @AddFunc <> nil then
       begin
          Value:=AddFunc(2,2);
          showMessage('结果是:'+IntToStr(Value));
       end;
    end;
    {Package中过程的调用}
    procedure TMainForm.Button2Click(Sender: TObject);
    var
       SayHelloProc:TSayHelloProc;
    begin
       @SayHelloProc:=GetProcAddress(PackageModule,PChar('SayHello'));
       if @SayHelloProc<>nil then
          SayHelloProc;
    end;
    end.
      

  3.   

    类也是一样的,跟dll中一样,用头文件最好了
      

  4.   

    至于类,可以用一个接口来实现
    下面代码仅供参考:
    1.在包中定义一接口
      IExample = interface(IUnknown)
      ['{3C71C678-FDDE-4374-9A42-DD773430D3B3}']
        procedure SayHello(s: string);
      end;
    2.新建一单元,定义类(需引用接口IExample所在单元) TExClass = class(TComponent, IExample)
        procedure SayHello(s: string);
      end; ....
    implementation
    procedure TExClass.SayHello(s: string);
    begin
      showmessage(s);
    end;
      initialization
        RegisterClass(TExClass);
      finalization
        UnRegisterClass(TExClass);  
      

  5.   

    接上,
    3.在主程序中调用
      private
        { Private declarations }
        PackageModule: HModule;
      ...
    procedure TMainForm.FormDestroy(Sender: TObject);
    begin
       if PackageModule <> 0 then
          UnloadPackage(PackageModule);
    end;procedure TMainForm.btGetClassClick(Sender: TObject);
    var
      AExam: IExample;
      AClass: TComponentClass;
    begin
      if PackageModule <> 0 then
      begin
        AClass := TComponentClass(GetClass('TExClass'));
        if AClass <> nil then
        begin
          AExam := AClass.Create(nil) as IExample;
          AExam.SayHello('hello');
          AExam := nil;
        end;
      end;
    end;
      

  6.   

    多谢 pibpib2001(风轻云淡)To ljmanage(过客):照你所说,应该怎样实现,能给出具体的例子吗?可另外开帖给分!