AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Aus DLL Button erstellen

Ein Thema von Thanatos81 · begonnen am 13. Aug 2006 · letzter Beitrag vom 15. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2   
Thanatos81
(Gast)

n/a Beiträge
 
#1

Aus DLL Button erstellen

  Alt 13. Aug 2006, 19:43
Hallo zusammen!

Wir testen hier gerade ein wenig mit DLLs als PlugIns zur Programmerweiterung / modularen Programmaufbau. Das klappt soweit auch schon ganz gut, bis auf eine Kleinigkeit... Und zwar versuchen wir aus einer DLL heraus einen Button auf dem Mainform zu erzeugen.

Dabei bekommen wir allerdings die Fehlermeldung "TFont kann nicht TFont zugewiesen werden." Hat jemand eine Idee, woran das liegen könnte?

Schönen Gruß,
Thomas
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#2

Re: Aus DLL Button erstellen

  Alt 13. Aug 2006, 19:50
Zitat von Thanatos81:
Dabei bekommen wir allerdings die Fehlermeldung "TFont kann nicht TFont zugewiesen werden." Hat jemand eine Idee, woran das liegen könnte?
Ohne entsprechende Quellcodezeilen wird das schwer.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Aus DLL Button erstellen

  Alt 13. Aug 2006, 19:56
Zitat von Balu der Bär:
Ohne entsprechende Quellcodezeilen wird das schwer.
Ist nicht schwer. Wenn Du VCL-Objekte in der DLL ereugst und in der Exe anzeigen lassen willst aber keine Laufzeitpackages verwendst kommt dieser Fehler ziemlich zu erst, da TObject in Exe <> TObject in DLL.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#4

Re: Aus DLL Button erstellen

  Alt 14. Aug 2006, 09:04
DAnke euch beiden erstmal.

@Bernhard
Laufzeitpackages wären nicht unbedingt unsere Wahl. Würde es denn mit PlugIns auf .bpl-Basis funktionieren?
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#5

Re: Aus DLL Button erstellen

  Alt 14. Aug 2006, 10:53
Da für .bpl-PlugIns anscheinend die gleiche Beschränkung besteht, haben wir es jetzt doch mit Laufzeitpackages und ner DLL gemacht. Der Button ist da, allerdings bekommen wir noch eine ungültige Zeigeroperation.

Quellcode aus der EXE:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var DllPrg : procedure (Parent : TForm); stdcall;
    Handle : cardinal;
begin
  Handle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'project2.dll'));
  if Handle <> 0 then
    begin
      @DllPrg := GetProcAddress(Handle, 'BtnErzeugen');
      if @DllPrg <> nil then
        begin
          DllPrg(Form1); //<--- hier kommt die ungültige Zeigeroperation
        end;
    end;
end;
Quellcode aus der DLL:
Delphi-Quellcode:
procedure BtnErzeugen(parent : Tform); stdcall;
var btn : TButton;
begin
  btn := TButton.create(parent);
  btn.parent := parent;
  btn.name := 'btn1';
  btn.left := 100;
  btn.top := 100;
end;
Danke schon mal!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Aus DLL Button erstellen

  Alt 14. Aug 2006, 11:25
Ich tipp mal darauf das die Variable Form1 nil ist.
Ersetze es durch folgendes:

DllPrg(self); //<--- hier kommt die ungültige Zeigeroperation
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
pszopp

Registriert seit: 7. Sep 2005
Ort: Alsdorf
95 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Aus DLL Button erstellen

  Alt 14. Aug 2006, 13:34
Hallo Thanatos81,

ich habe in einem meiner Programme sowas schonmal realisiert.
Dabei hat jedes Plugin bestimmte Prozeduren/Funktionen:

Delphi-Quellcode:
  // Liefert die Anzahl der Buttons, die das Plugin braucht.
  Function GetButtonCount : Integer; STDCALL;
  // Liefert die Caption eines Buttons
  Function GetButtonCaption(aIndex : Integer) : PChar; STDCALL;
  // Informiert das Plugin über den Klick auf einen Button.
  Procedure ButtonClicked(aIndex : Integer); STDCALL;
Beim Start des Programms schaut es für jedes Plugin über die Funktion "GetButtonCount" nach,
wieviele Buttons das aktuelle Plugin brauchen.
Im Programm werden dann die Buttons erzeugt, und die Caption jedes Buttons wird im passenden Plugin
über die Methode "GetButtonCaption" erfragt. aIndex gibt dabei an, um welchen Button des Plugins es sich handelt.
Klickt der Benutzer auf einen Button, sucht sich das Programm anhand des Buttons das zutreffende Plugin aus,
und ruft dort die Methode "ButtonClicked" mit passendem Index auf.

Diese Lösung hat den Vorteil, dass die Buttons komplett vom Programm verwaltet werden und nicht von der Dll.
Sie ist dafür evtl etwas aufwendiger zu programmieren.


Viele Grüße,
pszopp
www.pstipp.de | Tippseite zur Formel 1 und Fußball WM/EM - kostenlos und Just-For-Fun
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#8

Re: Aus DLL Button erstellen

  Alt 14. Aug 2006, 15:39
@pszopp
Mir würde die von dir vorgeschlagene Vorgehensweise auch besser gefallen. Aber mein Kollege möchte sich alle Möglichkeiten offen halten. Also z.B. auch einen Indy-TCP-Server oder ein StringGrid aus der DLL herauserzeugen können ohne jedesmal das Interface in der Hauptanwendung anzupassen...

@Bernhard
Knapp daneben Form1 war nicht nil, sondern es fehlte ein simples ShareMem in der .dpr der Hauptanwendung

Jetzt funktioniert das ganze aber Danke euch allen nochmal!
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#9

Re: Aus DLL Button erstellen

  Alt 15. Aug 2006, 07:59
So, damit andere die so etwas brauchen nicht lange suchen und fragen müssen, mal ein kleines Demoprojekt im Anhang. Zu beachten ist, das beide Projekte wie von Bernhard erwähnt mit Laufzeit-Packages compiliert werden müssen.

Schönen Gruß,
Thomas
Angehängte Dateien
Dateityp: rar dll-test_126.rar (17,9 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Aus DLL Button erstellen

  Alt 15. Aug 2006, 11:28
Hallo!

Ich habs fast genau so wie du gemacht, nur gehts bei mir nicht.
DLL:
Delphi-Quellcode:
library Project1;

uses
  ShareMem, SysUtils, Controls, Classes, ExtCtrls;

{$R *.res}

var
  Panel: TPanel;

procedure CreatePlugin(Owner:TComponent; Parent: TWinControl); stdcall; export;
begin
  Panel := TPanel.Create(Owner);
  Panel.Parent := Parent;
  Panel.Align := alClient;
end;

procedure DestroyPlugin; stdcall;
begin
  Panel.Free;
end;

exports
  CreatePlugin, DestroyPlugin;

begin

end.
Aufruf:
Delphi-Quellcode:
unit Unit3;

interface

uses
  Classes, Controls, Windows;

procedure CreatePlugin(FileName: string; Owner:TComponent; Parent: TWinControl);

implementation

procedure CreatePlugin(FileName: string; Owner:TComponent; Parent: TWinControl);
var
  CreatePluginProc: procedure(Owner:TComponent; Parent: TWinControl); stdcall;
  Handle: THandle;
begin
  Handle := LoadLibrary(PChar(FileName));
  if Handle <> 0 then
  begin
    @CreatePluginProc := GetProcAddress(Handle, 'CreatePlugin');
    if @CreatePluginProc <> nil then
    begin
      CreatePluginProc(Owner, Parent);
    end;
    FreeLibrary(Handle);
  end;
end;

end.
ShareMem ist sowhol in der DLL (siehe oben) wie auch in der DPR der Aufrufsawendung.

Was passt hier nicht?!

Grüße
Faux
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:25 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