Entwickler-Ecke
Dateizugriff - GetVolumeInformation bringt verschiedene HD-SNs ?
nooby - Mo 15.09.03 23:57
Titel: GetVolumeInformation bringt verschiedene HD-SNs ?
Ich rufe folgenden Befehl 2 mal an unterschiedlichen Stellen in meinem Programm auf. Bekomme jedoch unterschiedliche SNs. Wieso?
Delphi-Quelltext
1:
| GetVolumeInformation(pChar('C:\'), nil, 0, ID, dwx, dwy, nil, 0); |
Moderiert von
Klabautermann: Delphi-Tags hinzugefügt & BBCode Aktiviert.
UC-Chewie - 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.
Delete - Di 16.09.03 04:56
Eventuell ID mit 0 initialisiern.
nooby - 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?
Delete - 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 - 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 ..."
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); if (GetVolumeInformation(pChar('c:\'), nil, 0, ID, dwx, dwy, nil, 0)) then strHDSerial1 := IntToStr(ID^); ...
end; |
oder aber ich benutze folgende Variante und bekomme keine SN. Aber ansonsten läuft das Programm weiter ohne Fehler.
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 + ':\'), nil, 0, ID, dwx, dwy, nil, 0) then 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); strHDSerial1 := HDSerialID('c'); ... end; |
UC-Chewie - 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.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var ID: PDWord; begin New(ID); Dispose(ID) end; |
2.
Delphi-Quelltext
1: 2: 3: 4: 5:
| var ID: DWord; begin GetVolumeInformation('c:\', nil, 0, @ID, dwx, dwy, nil, 0); 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.
nooby - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!