Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffsverletzung nachdem eine Variable deklariert wurde (https://www.delphipraxis.net/138322-zugriffsverletzung-nachdem-eine-variable-deklariert-wurde.html)

derMischa 7. Aug 2009 13:13


Zugriffsverletzung nachdem eine Variable deklariert wurde
 
Hallo zusammen,
ich programmiere an einer DLL rum, in der unter anderem 2 records definiert sind. Der zweite record beinhaltet eine Instanz des ersten records. Der erste record besteht bisher lediglich aus einer Variablen. Bis zu diesem Stand funktionierte alles super. Nachdem ich im ersten record eine weitere Variable deklariert habe, bekomme ich jetzt neuerdings einen Zugriffsfehler beim Schreiben. Die Variable wurde aber noch nicht verwendet, nur deklariert. Habt ihr eine Idee, woran es liegen könnte? Es hat sich wirklich nur diese eine Zeile verändert.

Delphi-Quellcode:

type
  PData = ^TData;
  TData = record
    AnzParameter : Integer;
    test : Integer; //      <= zweite Variable
  end;

type
  PGesamt=^TGesamt;
  TGesamt=packed record

    // Hier werden noch weitere Variablen deklariert

    DataPtr: TData;                
   
    // Hier werden noch weitere Variablen deklariert

  end;

himitsu 7. Aug 2009 13:21

Re: Zugriffsverletzung nachdem eine Variable deklariert wurd
 
DLL ... wird die Variable jetzt übergreifend mit der EXE verwendet?

wenn ja, haben EXE und DLL auch die selbe Definition?
(wenn du da was einfügst verschiebt sich ja alles hinter DataPtr)

PS: DataPtr ist kein Pointer, der Record ist direkt integriert (ist ja TData und nicht PData)

PSS: und sicher, daß dieses Delphi.NET sein soll?

derMischa 7. Aug 2009 14:01

Re: Zugriffsverletzung nachdem eine Variable deklariert wurd
 
Ich denke, dass da genau das Problem liegt, dass ich da keinen Zeiger sondern ein TData verwendet habe. Das Problem ist, dass diese DLL in ein anderes Programm eingebunden wird und ich von diesem den Source nicht habe. In der Beispiel-DLL wird ein Zeiger verwendet. Das ist mir irgendwie nicht bewußt gewesen. Ich habe das jetzt so umgebogen:

Delphi-Quellcode:

type
  PData = ^TData;
  TData = record
    AnzParameter : Integer;
    test : Integer; //      <= zweite Variable
  end;

type
  PGesamt=^TGesamt;
  TGesamt=packed record

    // Hier werden noch weitere Variablen deklariert

    DataPtr: PData;                
   
    // Hier werden noch weitere Variablen deklariert

  end;
Jetzt muss ich natürlich entsprechend Speicher reservieren, was ich dann wie folgt gemacht habe:

Delphi-Quellcode:

procedure InitialisiereDLL(gesamt : PGesamt); export stdcall;
begin
  GetMem(gesamt^.DataPtr, SizeOf(TData));
end;
Es folgt eine Zugriffsverletzung beim Schreiben von Adresse 00000000

himitsu 7. Aug 2009 14:11

Re: Zugriffsverletzung nachdem eine Variable deklariert wurd
 
Delphi-Quellcode:
Es folgt eine Zugriffsverletzung beim Schreiben von Adresse 00000000
das klingt danach, als wenn gesamt = nil ($00000000)


procedure InitialisiereDLL(gesamt : PGesamt); export stdcall;
begin
if Assigned(gesamt) then ...Fehlerbehandlung;
GetMem(gesamt^.DataPtr, SizeOf(TData));
end;



und nochmals: dieses sieht mehr nach "Delphi Win32" aus und nicht nach .net
(wenn dem so ist, dann kannst du deinen 1. Post hier noch entsprechend http://www.delphipraxis.net/template.../icon_edit.gif-ieren)

derMischa 7. Aug 2009 14:59

Re: Zugriffsverletzung nachdem eine Variable deklariert wurd
 
Wie von dir vorgeschlagen, habe ich das überprüft und mir ist dabei aufgefallen, dass der Fehler schon vor InitialisiereDLL auftritt. Es hat sich herausgestellt, dass diese Prozedur nicht, wie von mir fälschlicherweise angenommen, als erstes aufgerufen wird. Nachdem ich dann herausbekommen hatte, welche Prozedur das war, und hier die Speicherreservierung vorgenommen habe, funktioniert jetzt auch alles so wie gewollt. Das Hauptproblem lag darin, dass ich keinen Zugriff auf den Sourcecode des aufrufenden Programmes habe. Wie du sicherlich gemerkt hast, bin ich mit Delphi noch nicht so vertraut. Was genau ist der Unterschied zwischen Delphi Win32 und .net bzw. woran erkenne ich, was ich nutze?

himitsu 7. Aug 2009 15:14

Re: Zugriffsverletzung nachdem eine Variable deklariert wurd
 
Delphi-nNet baut auf das dot-NET-Framwork auf und erstellt Programme für dieses,
wärend Delphi für Win32 native Windows-(32-Bit)-Programme erstellt, welche ohne über Framework direkt im Windows laufen.

Bei Google suchenFramework .net

PS: in deinem DP-Profil kannst du auch die von dir verwendete Delphi-Version angeben, damit andere wissen auf was sich die deine Fragen beziehen

derMischa 7. Aug 2009 15:38

Re: Zugriffsverletzung nachdem eine Variable deklariert wurd
 
Wenn ich mal wüßte, welche Version ich habe ;)
Hab mir den Turbo Delphi Explorer 2006 runtergeladen. Welche Version da mitgeliefert wird, weiss ich leider nicht.

himitsu 7. Aug 2009 15:47

Re: Zugriffsverletzung nachdem eine Variable deklariert wurd
 
Win32 ... du erstellst damit ja native Windows-Programme

derMischa 7. Aug 2009 16:05

Re: Zugriffsverletzung nachdem eine Variable deklariert wurd
 
und welcher Version im DP-Profil entspricht das?

DeddyH 7. Aug 2009 16:10

Re: Zugriffsverletzung nachdem eine Variable deklariert wurd
 
Turbo Delphi für Win32


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