2011-11-13 4 views
3

J'essaie de faire une application modulaire dans delphi2010 en utilisant BPL. Problème: lorsque j'essaie de créer une classe dans BPL, j'obtiens ce message d'erreur.Delphi: Erreur de ressource introuvable?

enter image description here

Je ne l'ai pas toute opération sur les ressources (fichier RES)!

Procedure TControllerMain.Btn1OnClick(Sender: TObject); 
type 
    TInitProcedure = function: TModuleBaseClass; stdcall; 
    TModuleBaseClass= class of TModuleBase; 
var 
    h: HMODULE; 
    proc: TInitProcedure; 
    vClass: TModuleBaseClass; 
begin 
    h := LoadPackage('test.bpl'); 
    @proc := GetProcAddress(h, 'InitializePlugin'); 
    vClass := proc(); 
    vClass.Create(nil); // error here 
    UnloadPackage(h); 
end; 

code dll

TModuleBase est un TCustomPanel

type 
    TVLCVideo = class(TModuleBase) 
    private 
    ... 
    public 
    ... 
    end; 
function InitializePlugin: TModuleBaseClass; stdcall; 


implementation 
function InitializePlugin: TModuleBaseClass; 
begin 
    Result := TVLCVideo; 
end; 


exports 
    InitializePlugin; 

end. 
+2

Ce genre d'erreur se produirait pendant le streaming DFM, mais seulement si 'TModuleBase' étaient provenant de' TForm' , 'TFrame', ou' TDataModule', pas de 'TCustomPanel'. –

+0

Okey, pouvez-vous me dire s'il y a un moyen d'utiliser des composants dans dll? Je ne veux pas créer un composant ActiveX – relativ

+1

Avez-vous le même problème si 'InitializePlugin()' renvoie un objet instancié au lieu d'un type de classe? À quoi ressemble la pile d'appels lorsque l'erreur se produit? –

Répondre

0

La solution:

j'étais utilisation TCustomPanel pour ancêtre de TModulBase mais j'ai été vu le problème, Remy a raison. et eux je supprime la classe ancêtre pour remplacer avec une interface et tous mes autres plugins doivent utiliser la même interface (si vous utilisez de cette façon avec le projet dll normal, vous obtiendrez une erreur différente! J'ai essayé :(vous devez l'utiliser avec bpl (bpl est une dll trop))

PIModuleBase = ^IModulBase; 

IModulBase = interface 
    ... 
end; 

ce clic de bouton est un échantillon que vous devez créer un gestionnaire de Modul classe

Procedure TControllerMain.Btn1OnClick(Sender: TObject); 
type 
    TInitProcedure = function: PIModuleBase; stdcall; 

var 
    h: HMODULE; 
    proc: TInitProcedure; 
    vClass: PIModuleBase; 
begin 
    h := LoadPackage('test.bpl'); 
    @proc := GetProcAddress(h, 'InitializePlugin'); 
    vClass := proc(); 
    vClass^.setParent(form1); 
    vClass^.setPosition(0,0,100,100); 
    vClass^.play(PChar('url of media')); 
    //UnloadPackage(h); 
end; 



type 
    TVLCVideo = class(TCustomPanel, IModulBase) 
    private 
    ... 
    public 
    ... 
    end; 
function InitializePlugin: PIModuleBase; stdcall; 


implementation 
function InitializePlugin: PIModuleBase; 
var 
v : TVLCVideo; 
begin 
    v := TVLCVideo.Create(nil); 
    Result := IModuleBase(v); 
end; 


exports 
    InitializePlugin; 

end. 

choses importantes:

vous ne pouvez pas importer la fichier de bibliothèque d'interface au fichier de module de module directement ou dans l'application principale projet d'ication! vous devez créer un nouveau projet bpl pour seulement l'interface et les fichiers de bibliothèque partagés, et vous devez les mettre dans les modules comme dans vlc, rtl.

Et vous devez construire l'application principale avec ce paquet d'interface

Build with runtime packages

enter image description here

Questions connexes