2010-10-21 5 views
0

Pour mon dernier projet, j'utilisais beaucoup de cadres dans mon application delphi, donc je dicided pour créer dll et les mettre à l'intérieur des dll (tous créés à Delphi)delphi exe et dll sans construire avec des packages d'exécution

j'ai passé à travers de nombreux sites Web et est venu avec le code qui fonctionne, mais pour cet exemple, je dois compiler à la fois des applications et des DLL avec construire avec des paquets d'exécution ce qui signifie que je dois distribuer les bpls aussi. et si Ne vérifiez construire avec l'erreur de packages d'exécution vient

c'est le code que j'ai trouvé

dans exe

procedure TForm1.Button1Click(Sender: TObject); 
type 
TGetTheFrame =Function(Owner: TComponent; TheParent: TWinControl): TFrame; stdcall ; 
var 
    GetTheFrame : TGetTheFrame; 
begin 
try 
    GetTheFrame(application,TabSheet1).Free ; 
except 
end; 
frm := GetTheFrame(application,TabSheet1) ; 
dllHandle := LoadLibrary('project1.dll') ; 
    if dllHandle <> 0 then 
    begin 
    GetTheFrame := GetProcAddress(dllHandle, 'GetTheFrame') ; 
    frm := GetTheFrame(application,TabSheet1) //call the function 
    { ShowMessage('error function not found') ; 
    FreeLibrary(dllHandle) ; } 
    end 
    else 
    begin 
    ShowMessage('xxxx.dll not found/not loaded') ; 
    end 

dans dll

Function GetTheFrame(Owner: TComponent; TheParent: TWinControl): TFrame; stdcall; 
Begin 
Result := TFrame2.Create(Owner); 

Result.Parent := TheParent; 
End; 

c'est tout, mais je veux ce code fonctionner sans packages d'exécution

+0

mais je suis sûr que le code est bon parce qu'il a fonctionné avec les paquets runtimw = e – VibeeshanRC

+1

Quel est l'objectif de ce premier appel 'GetTheFrame'? Si cela devait faire autre chose que de perdre votre mémoire au hasard, vous l'utilisez mal. Le compilateur devrait vous avertir que vous utilisez une variable non initialisée. –

+0

Voir ma réponse dans votre question précédente: http://stackoverflow.com/questions/3985256/how-to-use-delphi-dlls-without-enabling-build-with-runtime-packages Je pense que cette question est un doublon. –

Répondre

7

Dommage. Ce code ne fonctionnera pas sans les packages d'exécution. (Et avec paquets d'exécution, vous devez utiliser LoadPackage au lieu de LoadLibrary.)

Sans packages, chaque module de votre programme (EXE et chaque DLL) a sa propre copie de la définition de toutes les classes standards comprenant TFrame, TWinControl et même TObject. Une classe TWinControl de l'EXE ne ressemble pas à TWinControl à la DLL. Comme vous partagez des classes entre des modules, vous devez vous assurer qu'ils ont tous la même définition de ces classes, et que les packages d'exécution correspondent à la manière dont vous effectuez cette opération.

Si vous n'utilisez pas réellement les packages d'exécution, vous devez modifier l'interface de votre DLL afin qu'elle ne partage aucun type d'objet Delphi. Au lieu du parent TWinControl, transmettez la propriété Handle du contrôle ou toute autre valeur HWnd pour servir de fenêtre parent. Le code DLL ne sera plus capable de supposer qu'il existe un objet Delphi pour le parent, et le fichier EXE ne pourra pas supposer que le contrôle qu'il reçoit est un objet Delphi; ils seront limités à l'utilisation de l'API Windows pour manipuler les poignées de fenêtre et envoyer des messages.

+0

alors que puis-je faire maintenant – VibeeshanRC

+0

Le handle peut être passé en paramètre et retourné comme le résultat d'une fonction de la DLL. – skamradt

Questions connexes