![]() |
Re: Union Übersetzung nach Pascal
GetLastError gibt mir keinen Fehler zurück... Das Handle bekomm ich wie in MSDN beschrieben durch
Delphi-Quellcode:
Dieses Handle ist auch gültig.
h:= CreateFile('\\.\C:',0,FILE_SHARE_DELETE or FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0); Nebenbei mal ne Frage: Ich will ja (wie du vielleicht noch aus dem anderen Thread weißt) herausfinden wie viele Partitionen auf einer Festplatte sind und welche das dann sind. Komm ich hiermit überhaupt an mein Ziel? Hatte mal mit deiner WMI-Unit die Festplatten ausgelesen:
Delphi-Quellcode:
Da bekomme ich auch schön die Festplatten-Namen und ID's angezeigt (ID z.B \\.\PHYSICALDRIVE0).
var
X: TWMIInfo; i,j: Integer; begin ComputerName := '.'; WMIGetInfo(ComputerName,'root\CIMV2','','','SELECT Caption, DeviceID FROM Win32_DiskDrive',x); if x.Instance = nil then ShowMessage('Hat nicht geklappt'); for i:= 0 to High(x.Instance) do for j:= 0 to High(x.Propname) do ShowMessage(X.PropName[j] + ': ' + WMIRead(x,i,j)); Dann versuche ich damit die Partitionen auszulesen nämlich so:
Delphi-Quellcode:
(nach diesem Vorbild):
WMIGetInfo(ComputerName,'root\CIMV2','','','ASSOCIATORS OF {Win32_DiskDrive.DeviceID='''
+ WMIRead(x,0,1) + '''} WHERE AssocClass = Win32_DiskDriveToDiskPartition',y);
Code:
Aber da bekomm ich für Y immer nur nil zurück... (vgl.
'Use the disk drive device id to
'find associated partition query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _ & wmiDiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition" Set wmiDiskPartitions = wmiServices.ExecQuery(query) ![]() Gruß Neutral General |
Re: Union Übersetzung nach Pascal
Zitat:
Das gültige Handle bedeutet nur, daß du nun ein Handle mit den angegebenen Rechten bekommen hast, aber ob die Rechte auch für die gewünschte Funktion ausreichen?
Code:
also mit bekomm ich auch keine Antwort
Dh := CreateFile(PChar(S), [color=#ff0000]GENERIC_READ or GENERIC_WRITE[/color],
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, [color=#ff0000]0[/color], 0); Zitat:
![]() wenn \\.\PhysicalDrive0 einzeln vorkommen würde, dann könnte man es so machen, Zitat:
Notfalls halt alles durchgehn was Win32_DiskDriveToDiskPartition rausrückt und mit Pos in den Antworten danach suchen? |
Re: Union Übersetzung nach Pascal
Hi,
Also mit
Delphi-Quellcode:
erreiche ich auch nix (y = nil)...
SELECT * FROM Win32_DiskDriveToDiskPartition WHERE Antecedent = "\\.\PhysicalDrive0"
Ach ja:
Delphi-Quellcode:
ändert auch nix an der ganzen Sache...
Dh := CreateFile(PChar(S), GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); |
Re: Union Übersetzung nach Pascal
Zitat:
Kennst dich zufällig mit SQL aus? Die WMI-Queries ähneln diesem ja. Wie kann man da nach "TeilStrings" suchen? Zitat:
Wenn das dateihandle OK ist und DeviceIoControl True liefert, dann sollten eigentlich korrekt Werte in dem Record liegen. Also, ist DeviceIoControl = True und was gibt OutBytes zurück? Was sagt das?
Delphi-Quellcode:
H := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); Size := SizeOf(_DRIVE_LAYOUT_INFORMATION_EX) + SizeOf(_PARTITION_INFORMATION_EX) * 31; GetMem(P, Size); Try FillChar(P^, Size, 0); If DeviceIoControl(H, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, nil, 0, P, Size, OutBytes, nil) Then Begin ... End Else ShowMessage(SysErrorMessage(GetLastError)); Finally FreeMem(P); End; CloseHandle(H); |
Re: Union Übersetzung nach Pascal
Delphi-Quellcode:
Das sagt mir: 'klappt' :mrgreen:
procedure TForm1.Button6Click(Sender: TObject);
var H: THandle; P: PDRIVE_LAYOUT_INFORMATION_EX; outBytes: Cardinal; Size: Cardinal; begin H := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); Size := SizeOf(_DRIVE_LAYOUT_INFORMATION_EX) + SizeOf(_PARTITION_INFORMATION_EX) * 31; GetMem(P, Size); Try FillChar(P^, Size, 0); If DeviceIoControl(H, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, nil, 0, P, Size, OutBytes, nil) Then ShowMessage('Klappt') Else ShowMessage(SysErrorMessage(GetLastError)); Finally FreeMem(P); End; CloseHandle(H); end; OutBytes = 4656 Werte von P sind die selben wie sonst auch... |
Re: Union Übersetzung nach Pascal
Delhpi kennt kein unsigned Int64, C aber schon. Man muss daher notgedrungen ein Int64 in Delphi nehmen und beim Rechnen auf das Vorzeichen aufpassen. Da gibt es aber selten Probleme, da ueblicherweise die Werte nicht so gross werden oder eh nicht gerechnet wird.
|
Re: Union Übersetzung nach Pascal
jetzt sag blos
![]() Robert: System.UInt64 :zwinker: [add] und jupp, dat sagt hier och klappt :gruebel: obwohl ich demnach angeblich 8 Partitionen hier hab, statt nur 2. Allerdings scheinen die weiteren Daten selber zu stimmen... - die Daten der ersten 2 Records kommen anscheinend hin - und die nachfolgenden Records sind mit 0 gefüllt |
Re: Union Übersetzung nach Pascal
Oops, UInt64 ist aber ziemlich frisch bei Delphi.
|
Re: Union Übersetzung nach Pascal
Zitat:
![]() kommt drauf an, was man "frisch" nennt :roll: @Neutral General: also komisch ist das Ganze schon, denn ich hab für den Test mit deiner Funktion meine Definitionen verwendet. Die Funktion ist ja i.O. und die Definitionen eigentlich uch, :stupid: dennoch gehts nicht, obwohl das ganze in meinem Programm läuft, wo ja der "selbe" Code verwendet wird. :gruebel: |
Re: Union Übersetzung nach Pascal
Zitat:
In welcher Unit ist das deklariert? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:58 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