Autor Beitrag
nooby
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win XP Pro.
D7
BeitragVerfasst: Mo 15.09.03 23:57 
Ich rufe folgenden Befehl 2 mal an unterschiedlichen Stellen in meinem Programm auf. Bekomme jedoch unterschiedliche SNs. Wieso?

ausblenden Delphi-Quelltext
1:
  GetVolumeInformation(pChar('C:\'), nil0, ID, dwx, dwy, nil0);					


Moderiert von user profile iconKlabautermann: Delphi-Tags hinzugefügt & BBCode Aktiviert.
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Di 16.09.03 00:34 
Hmm, seltsam. Solange der Datenträger (bzw. die Partition - also der logische Datenträger) nicht neu formatiert wurde, sollte die SN eigentlich gleich bleiben.
Poste doch mal den Code des Programms, in dem das passiert.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 16.09.03 04:56 
Eventuell ID mit 0 initialisiern.
nooby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win XP Pro.
D7
BeitragVerfasst: Di 16.09.03 12:29 
Es hat wohl etwas mit dem initialisieren zu tun gehabt. ID := 0 hat zwar nicht funktioniert, aber mit ID := ID vor dem Aufruf von GVI (so blöd das auch klingt) hat es dann funktioniert.

Andere Frage, beim ausführen des Quellcodes läuft jetzt alles richtig, aber wenn ich die exe dann starte, bekomme ich die Meldung:

Die Anweisung in "0x004039ca" verweist auf Speicher "0x014f2acc". Der Vorgang "read" konnte nicht auf dem Speicher ausgeführt werden... (wobei diese Speicherbereiche variieren)

Was kann das denn sein?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 16.09.03 18:08 
1. Neue Frage neuer Thread.

2. Auch wenn es dir total unwichtig erscheint, und das muß es, sonst würdest du es uns nicht verschweigen, aber es wäre mal interessant was du beim Programmstart so alles machst. :roll:
nooby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win XP Pro.
D7
BeitragVerfasst: Di 16.09.03 20:22 
Sorry, ist nicht bös gemeint, aber den ganzen Quellcode zu posten finde ich einfach übertrieben. Also, ich habe noch ein bischen probiert und habe folgendes festgestellt.
Das Problem ist definitiv die Funktion GetVolumeInformation. Ich habe Sie in 2 Varianten ausprobiert. A) ich bekomme ich meine SN, das Programm läuft weiter und beim "end;" kommt die Fehlermeldung: "Access Violation at address .... Read of address ..."

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
begin
  IniDat := TIniFile.Create(ExtractFilePath(paramstr(0))+'handi2dv.ini');
  AssignFile(ExportDatei, IniDat.ReadString ('DV_IMPORT','PFAD',''));
  Rewrite (ExportDatei);
 
 // HD SN auslesen
  if (GetVolumeInformation(pChar('c:\'), nil0, ID, dwx, dwy, nil0)) then
    strHDSerial1 := IntToStr(ID^);
...

end;


oder aber ich benutze folgende Variante und bekomme keine SN. Aber ansonsten läuft das Programm weiter ohne Fehler.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function HDSerialID(drive:Char): string;
var
  ID : PDWord;
  dwx,dwy : DWord;

begin
if GetVolumeInformation(pChar(drive + ':\'), nil0, ID, dwx, dwy, nil0then
  result := IntToStr(ID^)
else
  result := 'Error'
end;

begin
  IniDat := TIniFile.Create(ExtractFilePath(paramstr(0))+'handi2dv.ini');
  AssignFile(ExportDatei, IniDat.ReadString ('DV_IMPORT','PFAD',''));
  Rewrite (ExportDatei);
 
 // HD SN auslesen
   strHDSerial1 := HDSerialID('c');
...
end;
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Di 16.09.03 20:55 
Also, der Fehler ist folgender:

Du übergibst eine Variable vom Typ PDWord. Schön und gut soweit.
Aber: PDWord ist nichts weiteres als ein Zeiger auf einen DWord-Wert. Nun passiert folgendes: Du übergibst diesen Zeiger, der auf irgendeine zufällige Stelle (hängt davon ab, was vorher an der Stelle des Zeigers war) zeigt, und die Funktion schreibt dort die SN hin.
Du willst nun auf diese Stelle zugreifen, aber das darfst du nicht, denn du hättest die Stelle vorher reservieren müssen.

Lösungen:
1.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  ID: PDWord;
begin
  New(ID);
  //Aufruf von GetVolumeInformation wie gehabt
  //Benutze ID
  Dispose(ID)
end;


2.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var
  ID: DWord;
begin
  GetVolumeInformation('c:\'nil0, @ID, dwx, dwy, nil0);
end;


Edit: Dass du im zweiten Fall keine SN zurückkriegst, liegt daran, dass du an die Funktion 'c' übergibst, es müsste allerdings 'C:\' sein.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
nooby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win XP Pro.
D7
BeitragVerfasst: Di 16.09.03 21:07 
OK, das PDWord ein Zeiger ist, habe ich nicht mitbekommen. Danke für die Erklärung und die Lösung.