Delphi-PRAXiS

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

lizardking 3. Jul 2006 22:10

Re: PlugIn Schnittstelle - DLL
 
Zitat:

Zitat von Prototypjack
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.

Doch, es ist mit 'ner Dll zu regeln. ABER die VCL muss eben als Package eingebunden werden (bei den Compileroptionen "Build with packages" einschalten und die VCL als Package angeben). Deinen Code brauchst Du nicht in ein Package packen, sondern kannst gerne Dlls benutzen.

Was allerdings die Erweiterbarkeit ueber C++ etc. angeht... sobald Du Typen der VCL benutzt, laesst sich eh keine Sprache mehr verwenden, die die VCL nicht kennt. Dann muesstest Du die Daten schon "roh" uebergeben und nicht als TImage.

Gruesse,

Lizzy

Prototypjack 4. Jul 2006 11:06

Re: PlugIn Schnittstelle - DLL
 
Vielleicht werde ich sie irgendwie als Binäre Daten übergeben, später mal.
Auf jeden Fall funktioniert es jetzt und ich bedanke mich bei euch.
Achja, nochwas: Ich muss jetzt nicht irgendwelche VCL Packages mitausliefern oder?

Danke schonmal,
Max

alias5000 4. Jul 2006 11:43

Re: PlugIn Schnittstelle - DLL
 
Wenn du "Build with runtime packages" nicht an hast, dann nicht.

Prototypjack 4. Jul 2006 12:33

Re: PlugIn Schnittstelle - DLL
 
Na toll.

Über welchen Datentyp kann ich die Daten ohne Runtimepackages weitergeben?
Danke schonmal
Gruß,
Max

Prototypjack 5. Jul 2006 17:17

Re: PlugIn Schnittstelle - DLL
 
Hmm, irgendwie muss das doch auch ohne das Weitergeben von den Packages gehen.
Kann mir da wirklich keiner helfen?
Gruß,
Max

QuickAndDirty 2. Aug 2006 17:59

Re: PlugIn Schnittstelle - DLL
 
Hab jetzt das selbe gemacht.
Einfach die Daten roh durchreichen das geht.
"TStringlist ist nicht vom Typ TStringlist" man was hab ich gelacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 Uhr.

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