AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mainform aus DLL laden?

Ein Thema von Hyperspacer · begonnen am 27. Dez 2008 · letzter Beitrag vom 15. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
Hyperspacer

Registriert seit: 23. Apr 2006
53 Beiträge
 
Delphi 7 Personal
 
#1

Mainform aus DLL laden?

  Alt 27. Dez 2008, 00:08
Hallo,
Ich hoffe ich habe hier das richtige Forum erwischt, denn das Thema ist ziemliches Neuland für mich.

Also erstmal die Dinge die schon funktionieren(nur Hintergrundinfo):
Ich habe eine Anwendung, die ich über das Kontextmenü im Windows Explorer bei bestimmten Dateien(MP3s) starten kann. Wenn ich also viele Dateien markiere wird das Programm auch mehrfach gestartet. Ich habe mit der ONEinst Unit von Luckie dafür gesorgt, dass mein Programm nur einmal gestartet wird und dass alle markierten Dateien an diese eine instanz übergeben werden. Soweit so gut. Das Problem ist jetzt, dass das gegebene Programm inzwischen relativ groß geworden ist und lange zum laden braucht. Erst recht wenn eben 100 Dateien markiert wurden und das Programm 100mal gestartet wird.

Daher möchte ich mein ganzen Grundgerüst umwerfen und das Programm in DLLs verteilen, die immer nur dann geladen werden, wenn sie auch gebraucht werden. Auch die MainForm.
Ich hab inzwischen ein wenig über DLLs gelesen und weiß wie ich sie erstelle und wie ich "von außen" darauf zugreifen.

Wie schaffe ich es, dass ich die mainform als benutzer "normal" nutzen kann? Im Moment wird sie ja erzeugt und dan gleich wieder geschlossen...
Bisher hab ich folgendes:

Programm:
Delphi-Quellcode:
program bla;

uses
  windows, SysUtils;

type
  TStarteMainForm = procedure; stdcall;
  procedure StartMainForm;

Var
  DLL : THandle;

{$R *.res}

procedure StartMainForm;
Var
  StarteForm : TStarteMainForm;
begin
  DLL := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'test.dll'));

  If DLL <> 0 then
    begin
      @StarteForm := GetProcAddress(DLL, 'StartApplication');
      If @StarteForm <> nil then
        StarteForm;
    end;
end;

begin
  DLL := 0;

  StartMainForm;

  if DLL <> 0
    then FreeLibrary(DLL);
end;
end.
Die test.dll:
Delphi-Quellcode:
library MainDLL;

{ Haupt-DLL mit Hauptfenster }

uses
  Forms,
  Unit1 in 'unit1.pas{MainForm};

{$R *.res}

procedure StartApplication; stdcall;
begin
  Application.Initialize;
  Application.CreateForm(TForm1, MainForm);
  Application.Run;
end;


exports
  StartApplication;


begin
end.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: Mainform aus DLL laden?

  Alt 27. Dez 2008, 00:34
Ich denke mal das ist der falsche Weg. Du wirst Probleme bekommen zB. beim zuweisen und abrufen von Events ( beispielsweise FormButtonXYZClick etc.).
Selbst das Erstellen und Testen wird sich als schwierig erweisen. Die Formen nemen an sich nur wenig Platz ein das meiste sind Bilder, Sounds & der gleichen.
Diese kann man aber einfach in eine DLL auslagern.

Zitat von Hyperspacer:
Ich hoffe ich habe hier das richtige Forum erwischt ...
Passt schon.

Zitat von Hyperspacer:
Ich habe mit der ONEinst Unit von Luckie dafür gesorgt, dass mein Programm nur einmal gestartet ...
Ok.

Zitat von Hyperspacer:
Das Problem ist jetzt, dass das gegebene Programm inzwischen relativ groß geworden ist und lange zum laden braucht.
Das wird wohl an deinem Programmcode liegen.

Zitat von Hyperspacer:
Erst recht wenn eben 100 Dateien markiert wurden und das Programm 100mal gestartet wird.
Wie jetzt ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Florian H

Registriert seit: 30. Mär 2003
Ort: Mühlacker
1.043 Beiträge
 
Delphi 6 Professional
 
#3

Re: Mainform aus DLL laden?

  Alt 27. Dez 2008, 01:39
Zitat von turboPASCAL:
Zitat von Hyperspacer:
Erst recht wenn eben 100 Dateien markiert wurden und das Programm 100mal gestartet wird.
Wie jetzt ?
Er hat es so programmiert, dass, wenn man 100 Dateien markiert und das Programm im Kontextmenü aufruft, seine Software 100x gestartet wird, sich 99x direkt danach wieder verabschiedet, und nur ein Programm überlebt und weitermacht ...

Ich denke, das wäre ein ziemlich guter Ansatzpunkt zur Optimierung
Florian Heft
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: Mainform aus DLL laden?

  Alt 27. Dez 2008, 01:47
Zitat:
seine Software 100x gestartet wird, sich 99x direkt danach wieder verabschiedet
Autsch.

Zitat:
Ich denke, das wäre ein ziemlich guter Ansatzpunkt zur Optimierung
Auf alle Fälle.

Mit ParamStr() und ParamCount() die Strings in eine Liste verfrachten und gut ist.
Ggf. noch Drag&Drop einbauen.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Hyperspacer

Registriert seit: 23. Apr 2006
53 Beiträge
 
Delphi 7 Personal
 
#5

Re: Mainform aus DLL laden?

  Alt 27. Dez 2008, 11:18
Hallo,
Zitat:
Er hat es so programmiert, dass, wenn man 100 Dateien markiert und das Programm im Kontextmenü aufruft, seine Software 100x gestartet wird, sich 99x direkt danach wieder verabschiedet, und nur ein Programm überlebt und weitermacht ...
Genau so hab ich es gemacht Ich weiß, dass es nicht besonders ressourcensparend ist, aber einen anderen Weg kenne ich einfach nicht. Gerade deswegen möchte ich das hauptprogramm ja so klein wie möglich halten.
Zitat:
Die Formen nehmen an sich nur wenig Platz ein das meiste sind Bilder, Sounds & der gleichen.
Diese kann man aber einfach in eine DLL auslagern.
...Sowas hab ich gar nicht
Zitat:
Ich denke mal das ist der falsche Weg. Du wirst Probleme bekommen zB. beim zuweisen und abrufen von Events ( beispielsweise FormButtonXYZClick etc.).
Warum genau? Ich bin für Alternativen offen!

Liebe Grüße
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#6

Re: Mainform aus DLL laden?

  Alt 27. Dez 2008, 13:27
Mahlzeit!

Ich kenne Dein Problem, und frage mich schon länger selbst, wie das andere Programme machen, wenn man X Dateien im Explorer öffnet, das da alle in das (läufende) Programm kommen, ohne das X Instanzen davon geladen werden.

Da ich das noch nicht rausgefunden habe, eine kleine Alternative wäre, ein 2., winziges nonVCL Programm zu haben, was die Dateinamen zusammen schaufelt und dann in das laufende Programm sendet oder das Hauptprogramm startet und die Parameter übergibt.

MfG, Sun
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#7

Re: Mainform aus DLL laden?

  Alt 27. Dez 2008, 15:24
Bei D&D bekommt man eine Dateiliste der zu droppenden Dateien... das andere ist DDE (Dynamic Data Exchange) glaube über OLE oder so.

Muss jetzt wech zum Besuch...
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Hyperspacer

Registriert seit: 23. Apr 2006
53 Beiträge
 
Delphi 7 Personal
 
#8

Re: Mainform aus DLL laden?

  Alt 13. Jan 2009, 10:52
Zitat von turboPASCAL:
Bei D&D bekommt man eine Dateiliste der zu droppenden Dateien... das andere ist DDE (Dynamic Data Exchange) glaube über OLE oder so.
Drag&Drop habe ich bereits eingebaut. Allerdings bin ich damit auch noch nicht so ganz glücklich. Das soll aber erstmal egal sein.
Dein Hinweis auf DDE hat mich leider nicht weitergebracht. Könntest du mir etwas genauer erklären, was du damit in meinem Fall meinst?

Ansonsten habe ich jetzt eine Möglichkeit gefunden eine Form in eine DLL auszulagern. In der DLL erstelle ich die From modal. Ich hoffe, dass sie damit so lange angezeigt wird, wie ich das dann will.
Nur leider kann ich es nicht testen, weil ich noch ein ganz anderes problem hab:
Delphi-Quellcode:
program bla;

uses
  windows, SysUtils;

type
  TStarteMainForm = procedure; stdcall;
  procedure StartMainForm;

Var
  DLL : THandle;

{$R *.res}

procedure StartMainForm;
Var
  StarteForm : TStarteMainForm;
begin
  DLL := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'test.dll'));

  If DLL <> 0 then
    begin
      @StarteForm := GetProcAddress(DLL, 'StartApplication');
      If @StarteForm <> nil then
        StarteForm;
    end;
end;

begin
  DLL := 0;

  StartMainForm;

  if DLL <> 0
    then FreeLibrary(DLL);
end; // <-- Der Debugger will dieses end; WARUM? und wenn ich es einfüge, wird der Code vom begin bis zu dem end nicht ausgeführt?!
end.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Mainform aus DLL laden?

  Alt 13. Jan 2009, 11:06
Ich formatiere mal kurz um, was dein Compiler sieht:
Delphi-Quellcode:
program bla;

uses
  windows, SysUtils;

type
  TStarteMainForm = procedure; stdcall;


procedure StartMainForm; //<--Hier ist der Fehler
Var
  DLL : THandle;
  procedure StartMainForm; //Nested Procedure
  Var
    StarteForm : TStarteMainForm;
  begin
    DLL := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'test.dll'));

    If DLL <> 0 then
      begin
        @StarteForm := GetProcAddress(DLL, 'StartApplication');
        If @StarteForm <> nil then
          StarteForm;
      end;
  end;

begin //Procedure StartMainForm
  DLL := 0;

  StartMainForm;

  if DLL <> 0
    then FreeLibrary(DLL);
end;

//begin
end.
Eine Form in der DLL ist keine schöne Lösung. Du nutzt dann das Applicationobject der DLL. Und da würde ich mir nicht sicher sein, ob das irgendwann einmal querschießt.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#10

Re: Mainform aus DLL laden?

  Alt 13. Jan 2009, 11:43
Man könnte das Handle der App beim Aufrufen der DLL mit übergeben.

Quelle: Delphi-Referenz durchsuchenWiederverwenden von Formularen als DLLs
Zitat von Delphi Hilfe:
Beispiel

Das folgende Beispiel deklariert die Funktion GetPassword als eine Schnittstellenroutine. Die Export-Sektion schließt den GetPassword-Routinenamen ein, um sicherzustellen, daß die Funktion erfolgreich exportiert wurde.

Delphi-Quellcode:
unit PassForm;
interface
uses
 SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Forms, Controls, Forms, Dialogs, StdCtrls, Buttons;
type
  TPasswordForm = class(TForm)
  ...   { hier stehen verschiedene Anweisungen }
  end;
var
  PasswordForm: TPasswordForm;
function GetPassword(APassword: Pchar; hAppHandle: Thandle): WordBool
exports GetPassword;
implementation
function GetPassword(APassword: Pchar; hAppHandle: Thandle): WordBool

begin
  Application.Handle := hAppHandle; { Verbinden des DLL Application handle
              mit dem ladenden Application handle }

  PasswordForm := TPassWordForm.Create(Application);
  try
    if PasswordForm.ShowModal = mrOK then
    begin
      {Hier Quelltext, um die Werte der eingegebenen Paßworte zu überprüfen}
      Result := True;
    end;
  finally
    PasswordForm.Free;
  end;
end;
end.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz