Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL private prozeduren (https://www.delphipraxis.net/129161-dll-private-prozeduren.html)

gizzy 13. Feb 2009 15:53


DLL private prozeduren
 
Hai,

ich möchte gerne ein Bild in einer DLL bearbeiten, da es zuviel Quellcode gäbe.
Dazu gehören 2 Units und ca. 8 prozeduren die mit einen TImage arbeiten.

So.. Compilieren der DLL usw klappt einwanfrei, allerdings krieg ich eine Zugriffsverletzung .. Lesen von Adresse xyz.

Da ich eigentlich nicht mit DLL's arbeite ist die Frage ob ich vielleicht beim Aufbau was falsch gemacht habe.
Exportieren tue ich nämlich nur eine Function die die anderen Aufruft. Muss ich die Funktionen die ich nicht exportiere (auch die in den anderen Units) kennzeichnen (private) oder so? Ich hab diese bisher doof untereinander gesetzt..

Ohne DLL funktioniert alles super.

der Import:

Delphi-Quellcode:
function bearbeiten(img: TImage; font: PChar): Pchar; stdcall; external 'img.dll';
da sollte eig. nichts verkehrt sein.

Records und Globale Variablen Deklaration habe ich unter die uses in der DLL gesetzt. Direkt darunter alle Prozeduren und Funktionen.
Nerven tut mich das ich das Teil nicht Debuggen kann..

Irgentjemand ne Ahnung wo mein Problem liegt?

mkinzler 13. Feb 2009 15:57

Re: DLL private prozeduren
 
Du kannst keinen Delphiklasse (TImage) im Interface verwenden

Luckie 13. Feb 2009 15:58

Re: DLL private prozeduren
 
Du kannst nicht so einfach ein Objekt, welches nicht innerhalb der DLL erstellt wurde an eine Funktion in der DLL übergeben. Da beide unterschiedliche Speichermanager haben. Nicht umsonst, steht beim erstellen einer DLL mit der IDE ein ziemliuch langer Text am Anfang des Quellcodes, den man sich auch mal durchlesen sollte.

gizzy 13. Feb 2009 16:06

Re: DLL private prozeduren
 
Der Text am Anfang bezieht sich ja eig. auf die Strings.

Was muss ich also machen um das ich das Bild bearbeiten kann?

Zur Zeit habe ich das so:

Delphi-Quellcode:
function bearbeiten(img: TImage; font: PChar): PChar; stdcall;
begin
  Image:= TImage.Create(nil);
  Image.Width:= img.Width;
  Image.Height:= img.Height;
  Image.Picture.Assign(img.Picture);
//[...]
kommt da also nie mein Bild an, bzw ist es nicht erlaubt zu lesen?

Edit: ICh habe jetzt das Bild temporär gespeichert, übergebe den Pfad, LoadfromFile das Bild. Jetzt bekomm ich ne Zugriffsverletzung an einer anderen Position.
Maaaan ich glaub nicht das das so gut möglich ist ohne Debuggen..

an den untereinander geklatsche ohne private oder so kann es auch nicht liegen, der kann auf die Funktionen zugreifen?

brechi 13. Feb 2009 16:57

Re: DLL private prozeduren
 
Debug doch das Programm.
Und man kann schon ein Bitma übergeben. Aber nen PChar als Rückgabeparamater ist jetz net so das beste ;)

gizzy 13. Feb 2009 17:18

Re: DLL private prozeduren
 
Zitat:

Zitat von brechi
Debug doch das Programm.
Und man kann schon ein Bitma übergeben. Aber nen PChar als Rückgabeparamater ist jetz net so das beste ;)

Debuggen? Wie?

Doch, Pchar als Rückgabe ist schon beabsichtigt :)

himitsu 13. Feb 2009 17:26

Re: DLL private prozeduren
 
Zitat:

Zitat von gizzy
Doch, Pchar als Rückgabe ist schon beabsichtigt :)

sobald das, worauf der PChar zeigt, nicht am Ende der DLL-Prozedur freigegeben wird, hast du ein kleines "Problem".

gizzy 13. Feb 2009 17:51

Re: DLL private prozeduren
 
Delphi-Quellcode:
function decrypt(img: TBitmap; font: PChar): PChar; stdcall;
begin
  Image:= TImage.Create(nil);
  //Load Image
  Image.Picture.Bitmap.Assign(img);
  Image.Width:= img.Width;
  Image.Height:= img.Height;
  //Open Knowledge
  BackProp := TBackProp.Create(DEFAULT_INPUT_PATTERN_HEIGHT,
                               DEFAULT_INPUT_PATTERN_WIDTH,
                               DEFAULT_TARGET_PATTERN_HEIGHT,
                               DEFAULT_TARGET_PATTERN_WIDTH,
                               DEFAULT_NUMBER_OF_HIDDEN_NEURON);
  //Create Knowledge from FONT
  BackProp.Create(font);
  //Init standard holds
  FBWThreshold:= 196;
  FNoiseThreshold := 10;
  FSpaceWidth := 22;
  //Start solving
  Recognize;
  result:= Pchar(FResultText);
  //Free Image
  if assigned(Image) then
     freeandnil(Image);
end;
Das ist die Funktion in meiner DLL. Ich bekomme jetzt mit Bitmap einen seltsamen Fehler (Konvertierung)

Und wie soll ich in meiner DLL ein Haltepunkt erstellen??
Sobald ich meine ganzen Funktionen zusammen mit dem Aufruf in eine VCL Unit packe funktioniert es...

brechi 13. Feb 2009 17:56

Re: DLL private prozeduren
 
Du kannst die dll ganz normal Debuggen wenn du das rojekte in Delphi geladen hast und dann die Hostanwendung (also das Programm welches die DLL lädt) angibst. Dann kannst du normal mit F9 starten und das Programm sollte am BP halten.

Programmier außerdem immer mit try finally und gib einen String zurück (entsprechende Unit sharemem als 1. einbinden). Der PChar (Kann) im Hauptprogramm nicht meh gültig sein, da die Lokale String Variable die darauf verweist beim Beenden der Prozedur deiner dll eventl. nicht mehr gültig ist.

himitsu 13. Feb 2009 18:03

Re: DLL private prozeduren
 
Zitat:

Zitat von gizzy
Und wie soll ich in meiner DLL ein Haltepunkt erstellen??

indem du das DLL-Projekt lins Delphi lädst, im Menü Start > Parameter... dein Programm als Hostanwendung angibst und den Debugger startest.

Zitat:

Zitat von gizzy
Sobald ich meine ganzen Funktionen zusammen mit dem Aufruf in eine VCL Unit packe funktioniert es...

Wie schon erwähnt wurde, sobald du versuchst über Programm/DLL-Grenzen hinweg etwas macht, was den Speichermanader von delphi in Anspruch nimmt.

Das Programm und die DLL haben erstmal je ihren eigenen Speichermanager.
Dann gibt es mit Klassen (und Ähnlichem) probleme, daß Programm und DLL je ihre eigene Type-Library eingebaut haben, welche zwar Inhaltlich gleich sein mögen, aber dennoch unterschiedlich sind, da dort alles via Pointer verglichen wird ... z.B.: DLL:TObject ist nicht Programm:TObject


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 Uhr.
Seite 1 von 2  1 2      

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