Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PlugIn Schnittstelle - DLL (https://www.delphipraxis.net/72604-plugin-schnittstelle-dll.html)

Prototypjack 3. Jul 2006 18:45


PlugIn Schnittstelle - DLL
 
Hallo,
Zuerst muss ich mich entschuldigen, ich habe hier ein Problem mit Dlls und mit denen arbeite ich nur sehr selten und deshalb ist mein Wissen derer als sehr begrenzt einzustufen.
Also,
Wie sooft wenn ich etwas realisieren will, dass (zumindest für mich) mehr oder weniger neue "Technologien" erfordert baue ich es erstmal "im Reinen" in ein Testapp um dort das Potential austesten zu können. Deshalb ist mein Testapp auch teilweise mit Fragmenten bestückt die ich zum Testen benutzt habe und für das eigentliche Ziel unerheblich sind, das ganze hat etwas von einer Baustelle ;).

Zum Problem:
Ich habe hier eine Dll und ein Programm die Daten austauschen sollen(Die Dll soll einen Loader für spezifische Daten darstellen, welche immer erweitert werden(deshalb die Dll)). Die Dll "registriert" sich im Programm mit einem eigenen Typus("PlugIn") über den die Funktionen gesteuert werden.

Soweit, so gut, alles funktioniert, ich kann auch (testweise) Strings austauschen. Jedoch erfordert das Ziel den Austausch binärer Daten(in diesem Fall die Daten eines TBitmaps), und das will einach nicht funktionieren. Beide Funktionen funktionieren(angepasst auf Strings) anstandslos.

Es hat den anschein als würden einfach keine Daten ankommen.

Hier sind mal die Funktion und der Aufruf:
Aufruf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if opendialog1.Execute then
  begin
    Image1.Picture.Bitmap.Assign(
      FPlugIns[0].PlugIn.Loadmage(Opendialog1.Filename));
    showmessage(IntToStr(Image1.Picture.Bitmap.Height)); //<-- Ergibt "0"!
  end;
end;
Funktion:
Delphi-Quellcode:
function TPlugIn01.Loadmage(Filename: String): TBitmap;
var
  Bit: TBitmap;
begin
  Bit := TBitmap.Create;
  try
    Bit.LoadFromFile(Filename);
    Result :=Bit;
    MessageBox(Parent, PChar(IntToStr(Bit.Width)), '', 0);
  finally
    Bit.Free;
  end;
end;

Ich bedanke mich schonmal hier für die Aufmerksamkeit und hoffe auf eure Hilfe
Gruß,
Max

ste_ett 3. Jul 2006 19:10

Re: PlugIn Schnittstelle - DLL
 
Hast du den Kommentar gelesen, der in jedem DLL-Prjekt oben drin steht? :)
Hast du die Unit eingebunden?

Prototypjack 3. Jul 2006 19:20

Re: PlugIn Schnittstelle - DLL
 
Zum Grusse!
Aber natürlich, die "ShareMem.pas" befindet sich in beiden Projekten an Stelle 1.
Ich wollte es sogar mit FastMM4 lösen, jedoch komme ich dort nichtmal bis zum OnShow Event, das Programm stirbt schon viel früher und verabschiedet sich mit einer AC.

Würde sich diese essentielle Unit nicht im Projekt befinden, würde ja der String-Austausch auch nicht funktionieren, daran liegt's wohl nicht.

Bitte um weitere Antworten,
Gruß,
Max

PS: Wenn mehr Quellcode benötigt wird, einfach Sagen welchen und ihr sollt ihn bekommen ;)

lizardking 3. Jul 2006 20:40

Re: PlugIn Schnittstelle - DLL
 
Versuch's mal so: (ungetestet)

Delphi-Quellcode:
function TPlugIn01.Loadmage(Filename: String): TBitmap;
begin
  Result := TBitmap.Create;
  Result.LoadFromFile(Filename);
  MessageBox(Parent, PChar(IntToStr(Result.Width)), '', 0);
end;
Was Du gemacht hast ist naemlich, dem Result den Pointer auf das lokal erstellte Bitmap zu setzen. Da Du dann aber das Bitmap mit free wieder freigibst, ist logisch dass da nichts ankommt.

Gruesse,

Lizzy

Prototypjack 3. Jul 2006 20:54

Re: PlugIn Schnittstelle - DLL
 
Jetzt sagt er mir "Cannot assign a TBitmap to a TBitmap" in dem Moment wenn das Image das Tbitmap mit assign übernimmt.
Gruß,
Max

lizardking 3. Jul 2006 21:07

Re: PlugIn Schnittstelle - DLL
 
Zitat:

Zitat von Prototypjack
Jetzt sagt er mir "Cannot assign a TBitmap to a TBitmap" in dem Moment wenn das Image das Tbitmap mit assign übernimmt.
Gruß,
Max

Ahh.. ganz vergessen. Objekte kannst Du nur zwischen der Exe und der Dll austauschen, wenn Du mit Packages kompilierst. In diesem Fall muss die VCL als Package eingebunden werden. Wenn die VCL statisch eingebunden ist, stimmen die RTTI-Infos der Klassen nicht ueberein und es scheint als gaebe es 2 unterschiedliche Klassen TBitmap.

Gruesse,

Lizzy

Prototypjack 3. Jul 2006 21:14

Re: PlugIn Schnittstelle - DLL
 
Ok, und wie schaffe ich es die VCL reinzupacken?
Klingt jetzt vielleicht dumm und ich weiss bestimmt was du meinst nur eben momentan nicht ;)
Gruß,
Max

alias5000 3. Jul 2006 21:30

Re: PlugIn Schnittstelle - DLL
 
Du müsstest statt DLLs Packages verwenden, wenn ich das richtig beim überfliegen gelesen hab. Eine Anleitung dazu findest du z.B. hier http://www.alcaeus.org/filelib_detail.php?file_id=17

Gruß alias5000

Prototypjack 3. Jul 2006 22:00

Re: PlugIn Schnittstelle - DLL
 
Guten Abend!
Heisst das, es ist nicht möglich das über eine Dll zu regeln? Das kann ich mir nicht vorstellen, da es ja andere Projekte offenbar ähnlich lösen, ausserdem ist die Umstieg auf Packages schlecht, da damit die möglichkeit der erweiterung des Programmes durch andere Compiler(C++, f.e.) umgeworfen wird.
Es muss doch irgendwie gehen.
Ein weiteres Mal bitte ich um Hilfe
Gruß,
Max

alias5000 3. Jul 2006 22:04

Re: PlugIn Schnittstelle - DLL
 
Naja, dlls unterstüzen halt keine OOP


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz