Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT (https://www.delphipraxis.net/154342-ioctl_storage_get_device_number-drive_geometry-und-drive_layout.html)

Dezipaitor 8. Sep 2010 11:37

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT
 
himitsus Weg ist an sich schon der richtige.
Alter Mann, du gehst den C Weg und allokierst Speicher für Strings, was in Delphi ja garnicht notwendig ist. Man arbeitet solange mit dem Typ String bis eine WinAPI ein PWideChar will und konvertiert ihn dann dahin.

Ich hatte auch schon einige Probleme mit der Formatfunktion, wenn man den Wert direkt in PWideChar wandelt. Deshalb sollte man den Rückgabewert in eine Stringvariable speichern und diese dann an die WinAPI übergeben.

StrAlloc ist übrigens aus Kompatibilitätsgründen vorhanden und sollte nicht mehr verwendet werden.

JwaWindows und Windows sollte man nicht gleichzeitig verwenden, da die Typen nicht kompatibel/austauschbar für Delphi sind.

himitsu 8. Sep 2010 11:50

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT
 
Was sind denn diese "irgendwelche Pseudobezeichnungen" gewesen?


Solange der Wert, welcher nach PChar konvertiert wurde, nur innerhalb der aufrufenden Funktion genutzt wird (bei CreateFile ist das der Fall), sollte es eigentlich keine Probleme geben.

Delphi legt für das Result von Format automatisch eine temporäre Variable an und konvertiert erst danach nach PChar.
Diese temporäre Variable wird erst nach dem Aufruf dieser Funktion freigegeben (am Ende der Procedur/Funktion in welcher dieses genutzt wurde) oder zwecks Optimierung wiederverwendet (z.B. innerhalb von Schleifen).

Dezipaitor 8. Sep 2010 12:04

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT
 
Sollte man denken, aber Erfahrung sitzt tiefer.

himitsu 8. Sep 2010 12:06

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT
 
Zitat:

Zitat von Dezipaitor (Beitrag 1048180)
Sollte man denken, aber Erfahrung sitzt tiefer.

Meine Erfahrung war, daß ich bisher mit Format+PChar noch keine Probleme hatte.
Nja, vielleicht habt ihr einen der extrem selten Delphi-Bugs gefunden. :stupid:

Dezipaitor 8. Sep 2010 12:25

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT
 
Wäre nicht das erste Mal.

DevidEspenschied 8. Sep 2010 14:44

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT
 
Ich wollte heute mal die überarbeitete Version ausprobieren.

Das Auslesen logischer Laufwerke funktioniert problemlos. Das Auslesen physikalischer Laufwerke liefert eine Exception:

Im Projekt DI.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00464663 in Modul 'DI.exe'. Lesen von Adresse 00000000' aufgetreten.

Das ganze geschieht in der Datei uDevice.pas in Zeile 367. Falls ich hier was testen soll, bitte um Mitteilung genauerer Daten.

Alter Mann 8. Sep 2010 20:45

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT
 
@Himitsu


bittes das Statemant nicht persönlich nehmen.
Es sollte auf keinen Fall irgendeine Art von Anmache sein!
Falls es doch so aufgefasst wurde bitte ich um Entschuldigung.

Zitat:

Was sind denn diese "irgendwelche Pseudobezeichnungen" gewesen?
Ich hatte es wie vorgeschlagen auf CreateFile(PCHAR(Format gekürzt und mal laufen lassen.
Mit dem Ergebnis das statt 'Physicaldrive0' irgend etwas da Stand, bei dein anderen Einträgen sah es nicht besser aus. Also die Sache mit dem PCHAR wieder verworfen. Ich schau mal Morgen nach, woran es genau lag.

[EDIT]
Ich habe es heute noch mal geändert und siehe da es bringt das gewünschte Ergebnis, keine Ahnung woran es gestern lag.[/EDIT]

@devidespe
Zeile 367? Bitte mal eine Zeile höher, also 366 einen Breakpoint setzen und schauen welchen Wert
'Length(DR.PartitionData)' hat. Eventuell in 365 folgendes einfügen:
Delphi-Quellcode:
if Length(DR.PartitionData) > 0 then
Bis bald.

Alter Mann

himitsu 8. Sep 2010 20:52

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT
 
Zitat:

Zitat von Alter Mann (Beitrag 1048288)
Falls es doch so aufgefasst wurde bitte ich um Entschuldigung.

Nee nee, mach dir keine Sorgen deswegen.

Wie gesagt, ich hatte damit noch nie Probleme, was natürlich keine Probleme/(Compiler)Fehler bei anderen ausschließt.

Alter Mann 8. Sep 2010 21:08

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT
 
Wir können ja Freitag auf dem Dampfer ein Bierchen trinken, du bist doch da?

himitsu 8. Sep 2010 21:10

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT
 
Zitat:

Zitat von Alter Mann (Beitrag 1048293)
Wir können ja Freitag auf dem Dampfer ein Bierchen trinken, du bist doch da?

Ich trink zwar eigentlich kein Bier (schmeckt mir nicht wirklich),
aber wenn die uns aus'm Bundestag wieder rauslassen (das reinkommen ist schon schwer) ... gern


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 Uhr.
Seite 2 von 2     12   

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