AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL private prozeduren

Ein Thema von gizzy · begonnen am 13. Feb 2009 · letzter Beitrag vom 13. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von gizzy
gizzy

Registriert seit: 3. Jun 2007
59 Beiträge
 
Delphi 2007 Enterprise
 
#1

DLL private prozeduren

  Alt 13. Feb 2009, 15:53
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:

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?
David
[Fehler] Unit1.pas(1): Dein Kaffee ist kalt.
[Fehler] Unit1.pas(2): Dein linker großer Zeh ist eingeschlafen.
[Fataler Fehler] Projekt1.dpr(5): Verwendete Unit "Unit1.pas" kann nicht comiliert werden.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: DLL private prozeduren

  Alt 13. Feb 2009, 15:57
Du kannst keinen Delphiklasse (TImage) im Interface verwenden
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: DLL private prozeduren

  Alt 13. Feb 2009, 15:58
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von gizzy
gizzy

Registriert seit: 3. Jun 2007
59 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: DLL private prozeduren

  Alt 13. Feb 2009, 16:06
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?
David
[Fehler] Unit1.pas(1): Dein Kaffee ist kalt.
[Fehler] Unit1.pas(2): Dein linker großer Zeh ist eingeschlafen.
[Fataler Fehler] Projekt1.dpr(5): Verwendete Unit "Unit1.pas" kann nicht comiliert werden.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#5

Re: DLL private prozeduren

  Alt 13. Feb 2009, 16:57
Debug doch das Programm.
Und man kann schon ein Bitma übergeben. Aber nen PChar als Rückgabeparamater ist jetz net so das beste
  Mit Zitat antworten Zitat
Benutzerbild von gizzy
gizzy

Registriert seit: 3. Jun 2007
59 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: DLL private prozeduren

  Alt 13. Feb 2009, 17:18
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
David
[Fehler] Unit1.pas(1): Dein Kaffee ist kalt.
[Fehler] Unit1.pas(2): Dein linker großer Zeh ist eingeschlafen.
[Fataler Fehler] Projekt1.dpr(5): Verwendete Unit "Unit1.pas" kann nicht comiliert werden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#7

Re: DLL private prozeduren

  Alt 13. Feb 2009, 17:26
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".
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von gizzy
gizzy

Registriert seit: 3. Jun 2007
59 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: DLL private prozeduren

  Alt 13. Feb 2009, 17:51
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...
David
[Fehler] Unit1.pas(1): Dein Kaffee ist kalt.
[Fehler] Unit1.pas(2): Dein linker großer Zeh ist eingeschlafen.
[Fataler Fehler] Projekt1.dpr(5): Verwendete Unit "Unit1.pas" kann nicht comiliert werden.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#9

Re: DLL private prozeduren

  Alt 13. Feb 2009, 17:56
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#10

Re: DLL private prozeduren

  Alt 13. Feb 2009, 18:03
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 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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 Uhr.
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