Einzelnen Beitrag anzeigen

Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: wie kommt man von TApplication nach TForm1 ?

  Alt 27. Aug 2023, 14:28
Hallo @Delphi.Narium

Dein Lösungsansatz ist dadurch limitiert, da die DLL doch die Struktur der TForm1
nicht kennen kann.
Es ist gefühlsmäßig bei mir so, dass das Delphi von Haus aus macht, also COM+, weil:
es wird in TApplication Object die Eigenschaft "Components" angeboten.

Darüber könnte man doch iterrieren, und prüfen, ob ein bestimmtes Control/Component
vorhanden ist: Delphi calls DLL calls Delphi.

Ich habe das jetzt erfolgreich umsetzen können (entweder mal auf mein git Account schauen)
oder hier ein kleines Snippet:
Delphi-Quellcode:
unit code;

interface

uses
  Forms, Dialogs, Controls, Classes, SysUtils;

type
  TPluginItemObject = class(TObject)
  private
    FValueA: Integer;
  public
    property ValueA: Integer read FValueA write FValueA;
  end;

  TPluginCollection = class(TCollection)
  private
    FItemCount: Integer;

    function GetItemObject(AIndex: Integer): TPluginItemObject;
    function GetItemString(AName: String): TPluginItemObject;

    function GetItemCount: Integer;
  public
    function Add(AName: String): TPluginItemObject;

    constructor Create;
    destructor Destroy; override;

    property Objects[AIndex: Integer]: TPluginItemObject read GetItemObject;
    property Strings[AName: String]: TPluginItemObject read GetItemString;

    property Count: Integer read GetItemCount;
  end;

  TPluginInterface = class(TObject)
  private
    FFileVersion : String;
    FFileAuthor : String;
    FFileDescription: String;

    function GetVersion: String;
    function GetAuthor: String;
    function GetDescription: String;

  public
    constructor Create;
    destructor Destroy; override;

  public
    property Description: String read FFileDescription;
    property Author: String read FFileAuthor;
    property Version: String read FFileVersion;
  end;


function RegisterPlugin(app: TApplication): Boolean; stdcall; export;
exports
  RegisterPlugin;

implementation

constructor TPluginCollection.Create;
begin
  FItemCount := -1;
end;
destructor TPluginCollection.Destroy;
begin
  inherited Destroy;
end;

function TPluginCollection.Add(AName: String): TPluginItemObject;
var
  plugin: TPluginItemObject;
begin
  plugin := TPluginItemObject(inherited Add);
  result := plugin;
end;

function TPluginCollection.GetItemObject(AIndex: Integer): TPluginItemObject;
begin
  result := TPluginItemObject(inherited Add);
end;

function TPluginCollection.GetItemString(AName: String): TPluginItemObject;
begin
  result := TPluginItemObject(inherited Add);
end;

function TPluginCollection.GetItemCount: Integer;
begin
  result := FItemCount;
end;

constructor TPluginInterface.Create;
begin
  inherited Create;
  FFileVersion := '1.0.0';
  FFileDescription := 'Standard Controls';
  FFileAuthor := 'Jens Kallup - paule32';
end;
destructor TPluginInterface.Destroy;
begin
  inherited Destroy;
end;

function TPluginInterface.GetVersion: String;
begin
  result := FFileVersion;
end;

function TPluginInterface.GetAuthor: String;
begin
  result := FFileAuthor;
end;

function TPluginInterface.GetDescription: String;
begin
  result := FFileDescription;
end;

function RegisterPlugin(app: TApplication): Boolean; stdcall; export;
var
  C: TPluginInterface;
  T: TControl;
begin
  try
    try
      if LowerCase(ExtractFileName(app.ExeName)) <> 'editor.exethen
      raise Exception.Create('Host-Application does not match file name');

      if app.ComponentCount < 0 then
      raise Exception.Create('Host-Application is empty.');

      ShowMessage(app.Title);
      C := TPluginInterface.Create;
      ShowMessage(C.GetVersion);
      FreeAndNil(C);
    except
      on E: Exception do
      begin
        ShowMessage('Error:' +
        #10 + 'ClassName: '  + E.ClassName +
        #10 + 'Message : '  + E.Message);
        result := false;
        exit;
      end;
    end;
  finally
  end;
  result := true;
end;
selbst EH ist in der DLL möglich - hätte ich nicht gedacht...
aber schau mal RegisterPlugin genauer an, das kommt fast ohne Cast zu TForm1 aus.
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat