Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Union Übersetzung nach Pascal (https://www.delphipraxis.net/88246-union-uebersetzung-nach-pascal.html)

Neutral General 12. Mär 2007 17:42

Re: Union Übersetzung nach Pascal
 
GetLastError gibt mir keinen Fehler zurück... Das Handle bekomm ich wie in MSDN beschrieben durch

Delphi-Quellcode:
h:= CreateFile('\\.\C:',0,FILE_SHARE_DELETE or FILE_SHARE_READ or FILE_SHARE_WRITE,
                 nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
Dieses Handle ist auch gültig.

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:
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));
Da bekomme ich auch schön die Festplatten-Namen und ID's angezeigt (ID z.B \\.\PHYSICALDRIVE0).
Dann versuche ich damit die Partitionen auszulesen nämlich so:

Delphi-Quellcode:
WMIGetInfo(ComputerName,'root\CIMV2','','','ASSOCIATORS OF {Win32_DiskDrive.DeviceID='''
             + WMIRead(x,0,1) + '''} WHERE AssocClass = Win32_DiskDriveToDiskPartition',y);
(nach diesem Vorbild):

Code:
'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)
Aber da bekomm ich für Y immer nur nil zurück... (vgl. Letztes Beispiel)

Gruß
Neutral General

himitsu 12. Mär 2007 18:18

Re: Union Übersetzung nach Pascal
 
Zitat:

Zitat von Neutral General
Dieses Handle ist auch gültig.

Ein gültiges Handle heißt noch garnichts.

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:
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);
also mit bekomm ich auch keine Antwort
Zitat:

ASSOCIATORS OF {Win32_DiskDrive.DeviceID='\\.\PHYSICALDRIVE0'} WHERE AssocClass = Win32_DiskDriveToDiskPartition
> http://www.delphipraxis.net/internal...ct.php?t=89423

wenn \\.\PhysicalDrive0 einzeln vorkommen würde, dann könnte man es so machen,
Zitat:

SELECT * FROM Win32_DiskDriveToDiskPartition WHERE Antecedent = "\\.\PhysicalDrive0"
aber wie man nur "teilweise" suchen kann weiß ich auch nicht -.-''

Notfalls halt alles durchgehn was Win32_DiskDriveToDiskPartition rausrückt und mit Pos in den Antworten danach suchen?

Neutral General 12. Mär 2007 18:35

Re: Union Übersetzung nach Pascal
 
Hi,

Also mit

Delphi-Quellcode:
SELECT * FROM Win32_DiskDriveToDiskPartition WHERE Antecedent = "\\.\PhysicalDrive0"
erreiche ich auch nix (y = nil)...

Ach ja:

Delphi-Quellcode:
Dh := CreateFile(PChar(S), GENERIC_READ or GENERIC_WRITE,
  FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
ändert auch nix an der ganzen Sache...

himitsu 12. Mär 2007 19:14

Re: Union Übersetzung nach Pascal
 
Zitat:

Zitat von Neutral General
Also mit ... erreiche ich auch nix (y = nil)...

sag ich doch?

Kennst dich zufällig mit SQL aus?
Die WMI-Queries ähneln diesem ja.

Wie kann man da nach "TeilStrings" suchen?


Zitat:

Zitat von Neutral General
Ach ja ... ändert auch nix an der ganzen Sache...

Hast du den Record vorher mal geleert?

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);

Neutral General 12. Mär 2007 19:24

Re: Union Übersetzung nach Pascal
 
Delphi-Quellcode:
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;
Das sagt mir: 'klappt' :mrgreen:
OutBytes = 4656
Werte von P sind die selben wie sonst auch...

Robert Marquardt 12. Mär 2007 19:31

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.

himitsu 12. Mär 2007 20:47

Re: Union Übersetzung nach Pascal
 
jetzt sag blos das zeigt was falsches an?

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

Robert Marquardt 13. Mär 2007 05:01

Re: Union Übersetzung nach Pascal
 
Oops, UInt64 ist aber ziemlich frisch bei Delphi.

himitsu 13. Mär 2007 09:51

Re: Union Übersetzung nach Pascal
 
Zitat:

Zitat von Robert Marquardt
Oops, UInt64 ist aber ziemlich frisch bei Delphi.

> http://www.delphipraxis.net/internal...=694376#694376

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:

Robert Marquardt 13. Mär 2007 10:07

Re: Union Übersetzung nach Pascal
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
// ab Delphi 6:
Type DWord64 = System.UInt64;
   LargeWord = System.UInt64;


// und D1 bis D5:
Type DWord64 = Type System.Int64;
   LargeWord = Type System.Int64;

Haeh?
In welcher Unit ist das deklariert?


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

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz