![]() |
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:
da sollte eig. nichts verkehrt sein.
function bearbeiten(img: TImage; font: PChar): Pchar; stdcall; external 'img.dll';
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? |
Re: DLL private prozeduren
Du kannst keinen Delphiklasse (TImage) im Interface verwenden
|
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.
|
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:
kommt da also nie mein Bild an, bzw ist es nicht erlaubt zu lesen?
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); //[...] 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? |
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 ;) |
Re: DLL private prozeduren
Zitat:
Doch, Pchar als Rückgabe ist schon beabsichtigt :) |
Re: DLL private prozeduren
Zitat:
|
Re: DLL private prozeduren
Delphi-Quellcode:
Das ist die Funktion in meiner DLL. Ich bekomme jetzt mit Bitmap einen seltsamen Fehler (Konvertierung)
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; 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... |
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. |
Re: DLL private prozeduren
Zitat:
Zitat:
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 20:48 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