Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi AccessViolation-Error mit DLL (https://www.delphipraxis.net/61016-accessviolation-error-mit-dll.html)

jamma-markus 15. Jan 2006 22:03


AccessViolation-Error mit DLL
 
hi,

ich bekomme jedes mal, wenn ich die prozedur "set_lang_values" aufrufe einen EAccessViolation-Error. die procedure hängt in einer dll.

Aufruf der Prozedur:
Delphi-Quellcode:
set_lang_values(language, mm_file, mm_exit, bt_add, bt_change, bt_del, bt_exit);
Prozedur
Delphi-Quellcode:
procedure set_lang_values(
  language : TLanguage_values;
  mm_file, mm_exit : TMenuItem;
  bt_add, bt_change, bt_del, bt_exit : TBitBtn); stdcall;
begin
//Mainmenü
  mm_file.Caption := string(language[0,0]);
  mm_exit.Caption := string(language[0,1]);
//Buttons
  bt_add.Caption := string(language[1,0]);
  bt_change.Caption := string(language[1,1]);
  bt_del.Caption := string(language[1,2]);
  bt_exit.Caption := string(language[1,3]);
end;
language ist so deklariert
Delphi-Quellcode:
type
  TLanguage_values = array [0..5, 0..50] of PChar;

var
  language : TLanguage_values;

Bernhard Geyer 15. Jan 2006 22:13

Re: AccessViolation-Error mit DLL
 
Ich hoffe du verwendest Runtime-Packages!

Falls nein darfst Du keine Objekte TMenuItem und TBitBtn über die DLL-Schnittstelle übergeben da du dann 2 komplett getrennte Objektmodelle hast. TObject aus der Exe <> TObject aus der DLL.

chaosben 16. Jan 2006 06:02

Re: AccessViolation-Error mit DLL
 
Verzeiht mir bitte, wenn ich jetzt ganz großen Müll erzähle, aber ich hab noch folgenden Alternativ-Vorschlag: Übergib doch nur die Adressen der Objekte und hole dir dann in der Dll die Objekte zu den Adressen.

SirThornberry 16. Jan 2006 06:55

Re: AccessViolation-Error mit DLL
 
hast du den Textabschnitt beachtet der im DLL-Projekt ganz oben steht wenn man ein neues Projekt anlegt? Wenn nicht, dann mal durchlesen und das was dort steht auch befolgen!

Bernhard Geyer 16. Jan 2006 07:34

Re: AccessViolation-Error mit DLL
 
Zitat:

Zitat von chaosben
Verzeiht mir bitte, wenn ich jetzt ganz großen Müll erzähle, aber ich hab noch folgenden Alternativ-Vorschlag: Übergib doch nur die Adressen der Objekte und hole dir dann in der Dll die Objekte zu den Adressen.

Bringt nicht bzw. kommt auf gleiche raus. Wenn in der Schnittstelle TBitBtn steht wird nur die Referenz (Adresse) auf das Objekt übergeben. Also genau das gleiche als wenn Pointer dort stehen würde.

jamma-markus 16. Jan 2006 11:21

Re: AccessViolation-Error mit DLL
 
Zitat:

Zitat von Bernhard Geyer
Ich hoffe du verwendest Runtime-Packages!

Falls nein darfst Du keine Objekte TMenuItem und TBitBtn über die DLL-Schnittstelle übergeben da du dann 2 komplett getrennte Objektmodelle hast. TObject aus der Exe <> TObject aus der DLL.

sory, aber was sind Runtime-Packages :?: :?: :?:
wie binde ich die ein/wie benutze ich die :?: :?: :?:

chaosben 16. Jan 2006 11:26

Re: AccessViolation-Error mit DLL
 
Zitat:

Zitat von Bernhard Geyer
Bringt nicht bzw. kommt auf gleiche raus. Wenn in der Schnittstelle TBitBtn steht wird nur die Referenz (Adresse) auf das Objekt übergeben. Also genau das gleiche als wenn Pointer dort stehen würde.

Ich gehe davon aus, das es seine eigene DLL ist. Also könnte er doch die Funktion dahingehend ändern, das er Integer-Werte übergibt (also die Adressen der Objekte) und sie dann in der DLL wieder auflöst.
Natürlich ist das unschöne Programmierung ... sozusagen "on the edge" ... aber es ist ja nur ein Alternativ-Vorschlag.
Wenn es ich um "Windows-Fenster" handelt, könnte man auch mit dem Handle arbeiten.

xaromz 16. Jan 2006 11:31

Re: AccessViolation-Error mit DLL
 
Hallo,
Zitat:

Zitat von chaosben
Ich gehe davon aus, das es seine eigene DLL ist. Also könnte er doch die Funktion dahingehend ändern, das er Integer-Werte übergibt (also die Adressen der Objekte) und sie dann in der DLL wieder auflöst.

Macht er doch. Ein Objekt ist nur ein Pointer. Ein Pointer ist nur ein integer.

Gruß
xaromz

Bernhard Geyer 16. Jan 2006 12:10

Re: AccessViolation-Error mit DLL
 
Zitat:

Zitat von chaosben
Zitat:

Zitat von Bernhard Geyer
Bringt nicht bzw. kommt auf gleiche raus. Wenn in der Schnittstelle TBitBtn steht wird nur die Referenz (Adresse) auf das Objekt übergeben. Also genau das gleiche als wenn Pointer dort stehen würde.

Ich gehe davon aus, das es seine eigene DLL ist. Also könnte er doch die Funktion dahingehend ändern, das er Integer-Werte übergibt (also die Adressen der Objekte) und sie dann in der DLL wieder auflöst.

Natürlich ist das unschöne Programmierung ... sozusagen "on the edge" ... aber es ist ja nur ein Alternativ-Vorschlag.

Gleiche Problem! TBitBtn von DLL <> TBitBtn von Exe

Zitat:

Zitat von jamma-markus
sory, aber was sind Runtime-Packages :?: :?: :?:
wie binde ich die ein/wie benutze ich die :?: :?: :?:

Lese mal in der Delphi-Hilfe unter Packages nach.

F.W. 16. Jan 2006 18:24

Re: AccessViolation-Error mit DLL
 
Also wo liegt nun genau das Problem?

Bei den übergebenen PChars oder bei den Objekten?

Zu den PChars:
Delphi-Quellcode:
(* Anders als bei Strings müssen diese erst Speicher zugewiesen bekommen, wenn sie nicht aus dem Quelltext heraus mit Konstanten gleichgesetzt werden: *)
var
 P: PChar;
begin
 P := 'Hallo Welt!';
end;

(* wenn ich DLLs PChars übergeben hab oder in einer DLL Funktion ein variabler PChar zurück gegeben wurde, hab ich dafür erst Speicher reservieren müssen: *)
var
 P: PChar;
 S: String;//intern dürfen Strings benutzt werden //soweit ich weiß
begin
 S := DateToStr(Date);//ein Bsp, wo man nicht einfach P := PChar(DateToStr(Date)) schreiben kann
 GetMem(P, Length(S));
//oder obere Zeile und den String weglassen und direkt folgendes schreiben
// GetMem(P, 10);
 StrPCopy(P, S);
end;
Soviel zum Thema PChars, vlt liegts ja an etwas in die Richtung.

Zu den Pointergeschichten: Mir hat mal jemand gesagt, dass es egal sei, wenn man an DLLs TMenuItem s übergibt und so, so lange die Version der VCL übereinstimmt! (zu Programmierspracheübergreifenden Projekten kann ich da nicht sagen!)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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