在包Package里RegisterClass一个Class(TMyClass),在exe程序中却不能GetClass('TMyClass')
调试时确定已经执行了
RegisterClass(TMyClass)
我的写法:
initialization
  RegisterClass(TMyClass);
在exe程序中,我先Handle := LoadPackage('PackageName') 
确保了Handle是有值的,且我调试Package时,确定他已经执行了。
然后我MyClass := GetClass('TMyClass')
但返回的MyClass is nil

解决方案 »

  1.   

    你好好看看DELPHI5或DELPHI6开发指南
      

  2.   

    想做插件是吗?做插件最好用.net,在Delphi上做插件,困难重重。
      

  3.   

    帮你顶咯。哈哈。没有用过package.
      

  4.   

    to:halfdream(哈欠) 
    TMyClass,是我在包里定义的一个Class
    比如: TForm1 = Class(TForm) 中的TForm1就是我的MyClass
      

  5.   

    楼主,我当然明白那是你自定义的类,
    我怀疑那个CLASS怎么定义的有关..
    把涉及隐私的部分删了,再把代码贴出来吧.
      

  6.   

    好的,没有什么隐私,我也是在测试
    下面是那个Package的代码
    unit VirtualDB;interfaceuses
      SysUtils, Classes, DB, DBTables;type
      TConcreteDataModule = class(TDataModule)
        dbDemo: TDatabase;
        Query1: TQuery;
      private
        { Private declarations }
      public    { Public declarations }
      end;var
      ConcreteDataModule: TConcreteDataModule;implementation{$R *.dfm}
    initialization
      RegisterClass(TConcreteDataModule);
    end.下面是调用Package的exe程序的代码
    unit TestPackageFrm;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, DBCtrls, DB, StdCtrls, Grids, DBGrids, DBTables,
      ComCtrls;type
      TTestPackageForm = class(TForm)
        DataSource1: TDataSource;
        DBNavigator1: TDBNavigator;
        DBGrid1: TDBGrid;
        Button1: TButton;
        StatusBar1: TStatusBar;
        procedure FormActivate(Sender: TObject);
      private
        aDBConnect:THandle ;
        procedure LoaddbPackage;
        procedure LoadDataModule;
        { Private declarations }
      public
        { Public declarations }
      end;var
      TestPackageForm: TTestPackageForm;implementation{$R *.dfm}procedure TTestPackageForm.LoadDataModule;
    var
      iCounter : Integer;
      dataModuleClass:TPersistentClass ;
      admGlobal:TDataModule ;
      aQuery:TQuery ;
    begin
      {Note that TApplication "owns" this form and thus it must be freed priorto unloading the package }
    //  dataModuleClass := GetClass('TConcreteDataModule');
      dataModuleClass := GetClass('TConcreteDataModule');
      if dataModuleClass <> nil then
      begin
        admGlobal :=TDataModule(TComponentClass(dataModuleClass).Create(Application));
        for iCounter := 0 to admGlobal.ComponentCount - 1 do begin
          if UpperCase(admGlobal.Components[iCounter].ClassName) = 'TQUERY' then begin
            aQuery := TQuery(admGlobal.Components[iCounter]);
            DataSource1.DataSet := aQuery;
            break;
          end;
        end;
      end;
    end;
    procedure TTestPackageForm.LoaddbPackage;
    begin  //我们必须加载数据库Package以便连结到数据库
      try
        aDBConnect := LoadPackage('Bpl\DBPackages.bpl');
        LoadDataModule ;
      except on E : Exception do begin
         MessageBeep(Word(-1));
         ShowMessage(E.Message);
         Application.Terminate;
         end;
       end;
    end;procedure TTestPackageForm.FormActivate(Sender: TObject);
    begin
      LoaddbPackage ;
    end;end.
      

  7.   

    今天才有空试了试,原因是这样的,你的EXE应该BUILD WITH RUNTIME PACKAGE.
    只要关键的一个BPL,   VCL.BPL.原因你想通了也较容易理解VirtualDB------------>VCL.BPL  (RegisterClass)TestPackage.exe-------->vcl.bpl (GetClass 所在单元不要静态编译进主程序)这样主程序与动库包必须共享同一个VCL.BPL包..
      

  8.   

    我搞定了。在package中定义要调用类,在主程序中动态调用包,用getclass调用类名,在编译主程序时,进入选项options/packages, 在runtimes Packages中,选中build with runtimes Packages
    在下面的输入框中,不要输入你的package名称,点击ok,编译即可