Autor Beitrag
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: Di 06.06.17 09:53 
C: Der Vorgang wurde erfolgreich beendet // unterstützt SMART
USB-DRIVES:
H: Die Anforderung konnte wegen eines E/A-Gerätefehlers nicht ausgeführt werden // unterstützt nicht SMART
Erneuter Aufruf:
H: Die angeforderte Ressource wird bereits verwendet // unterstützt nicht SMART
G: Die Anforderung wird nicht unterstützt // unterstützt SMART

Alles sehr rätselhaft.

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2279
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 06.06.17 09:57 
Wie wahr :oops:. Ungeachtet dessen, wurde an der Stelle weder 1,2 noch 4 zurückgeliefert. Wenn es so ist, wie t_roller schreibt, dann unterstützt keines meiner Laufwerke SMART. :lol:

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1575
Erhaltene Danke: 223


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Di 06.06.17 11:09 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es so ist, wie t_roller schreibt, dann unterstützt keines meiner Laufwerke SMART. :lol:


Leider kann ich fachlich / inhaltlich nicht mitreden, aber ist denn die letzte Aussage wirklich wahrscheinlich oder gar zutreffend? Oder anders, ist SMART nicht längst Standard, ohne den keine Festplatte heutzutage mehr hergestellt wird?
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: Di 06.06.17 12:03 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Oder anders, ist SMART nicht längst Standard, ohne den keine Festplatte heutzutage mehr hergestellt wird?


Jede HDD hat SMART, aber ob man die Werte auslesen kann, liegt am S-ATA-Contoller bzw. an der USB-Bridge.

Für diesen Beitrag haben gedankt: Delphi-Laie
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2279
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 07.06.17 02:02 
Auch wenn das so ist, möchte ich eine Funktion haben, die dieses "Merkmal" bestätigt.

Nachtrag

Ich vermute, dass die Windows HOME Edition ein Problem darstellt. Wahrscheinlich funktionieren die bislang getesteten Codefragmente nur unter PROF / ULTIMATE.
Wenn sich ein paar Kandidaten finden würden, die meine Demo im Anhang testen könnten, um dies zu bestätigen/widerlegen.
Den dabei geschriebenen LOG bitte hier eintragen und dazu schreiben, welche Windows Version ihr verwendet habt.

Danke! :beer:
Einloggen, um Attachments anzusehen!
_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53
Erhaltene Danke: 22

Win95 - Win8.1 / MSServer2000 - MSServer2012
Delphi 6pro / XE4
BeitragVerfasst: Do 08.06.17 19:09 
Hmm..

Also an HOME liegt es nicht..

Habe hier WIndows 8.1 Home..

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
[#] Laufwerk C  (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5
[#] Laufwerk D  (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5
[#] Laufwerk E  (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5
[#] Laufwerk F  
HandleError = 0
SmartVersionError = 1
SmartDataError = 1
[#] Laufwerk G  (Festplatte)
HandleError = 0
SmartVersionError = 1117
SmartDataError = 1117
[#] Laufwerk Z  
HandleError = 0
SmartVersionError = 1
SmartDataError = 1


Was deine Fehlercodes bedeuten kann ich nicht sagen, jedoch habe ich eine eigene Routine (mit D6), welche mir die gültigen SMART- Werte liefert.
Ich habe sie mal angehängt, ist eine Kombination aus diversen Beiträgen aus verschiedenen Foren und Techdocs von HD-Herstellern. ;)
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Frühlingsrolle
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: Do 08.06.17 19:25 
WIN8.1 Version 6.3, Build 9600

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
[#] Laufwerk C  (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5
[#] Laufwerk D  (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5
[#] Laufwerk E  (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5
[#] Laufwerk F  (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5
[#] Laufwerk H  (Festplatte) = USB-DISK
HandleError = 0
SmartVersionError = 1117
SmartDataError = 1117
[#] Laufwerk I  
HandleError = 0
SmartVersionError = 1
SmartDataError = 1

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2279
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 09.06.17 00:22 
Danke an die Tester. Ich hätte dazu schreiben sollen, dass die Anwendung mit Adminrechten auszuführen ist, oder zumindest das manifest einbauen, dann wäre der Fehler 5 (Zugriff verweigert) nicht entstanden.
Der Fehler 1117 (E/A fehlgeschlagen) ist dennoch interessant.
Resume: Es hätte theoretisch bei euch funktioniert, was bei mir nicht geht.

Danke für deinen Dateianhang Holgerx. Schau' ich mir natürlich gerne an.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53
Erhaltene Danke: 22

Win95 - Win8.1 / MSServer2000 - MSServer2012
Delphi 6pro / XE4
BeitragVerfasst: Fr 09.06.17 05:24 
Hmm..

Ich glaube, das Problem deiner Routinen ist die falsche Fehlerbehandlung!
ausblenden Delphi-Quelltext
1:
2:
3:
  DeviceIoControl(hDrive, SMART_GET_VERSION, nil0,
                  @gvParams, SizeOf(gvParams), bytesReturned, nil);
  result := GetLastError;


Nur wenn DeviceIoControl 'fehlschlägt' kann mit GetLastError der dazu gehörende Fehler ausgelesen werden!
Ansonsten kann da irgend ein alter Fehlercode drinnen stehen!

also:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  
  Result := 0;
  if not DeviceIoControl(hDrive, SMART_GET_VERSION, nil0,
                  @gvParams, SizeOf(gvParams), bytesReturned, nilthen
  result := GetLastError;


Dann sollte es richtig klappen ;)

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2279
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 09.06.17 06:46 
Das geht schon in Ordnung. Der Test soll nur zeigen, ob DeviceIoControl() erfolgreich war. In dem Fall ist GetLastError() = 0, ansonsten größer 0. So erfahre ich, warum es nicht geht, im gegebenen Fall.

Deine Unit funktionierte bei mir leider auch nicht. Mit SENDCMDINPARAMS und SENDCMDOUTPARAMS komm' ich auf keinen grünen Zweig.
Selbst im VC++, wo alle Typen und Konstanten gegeben sind, will es nicht gelingen.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53
Erhaltene Danke: 22

Win95 - Win8.1 / MSServer2000 - MSServer2012
Delphi 6pro / XE4
BeitragVerfasst: Fr 09.06.17 08:07 
Hmm..

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Das geht schon in Ordnung. Der Test soll nur zeigen, ob DeviceIoControl() erfolgreich war. In dem Fall ist GetLastError() = 0, ansonsten größer 0. So erfahre ich, warum es nicht geht, im gegebenen Fall.


Ob dass so stimmt bezweifle ich!
Die meisten API-Aufrufe setzen den LastError NICHT zurück.
Deshalb ist GetLastError nur dann Gültig, wenn der API-Aufruf 'Fehlgeschlagen' ist!
Ansonsten steht da ein Error-Code von einem anderen API-Aufruf drinnen, welcher irgendwan vorher stattgefunden hat.
Somit auch FehlerCodes, welche seitens deines eigendlichen Aufrufes garnicht möglich sind.. ;)

(Ich spreche da aus Erfahrung ;) )

Angehängt ist ein Testprogramm, welches bei mir unter Win7 Prof 64Bit wie auch unter Win8.1 HOME 64Bit die SMART-Werte der Laufwerke zurück gibt.
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Frühlingsrolle
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18694
Erhaltene Danke: 1620

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 09.06.17 08:15 
Auch in dem Testprogramm produziert das (logischerweise) falsche Werte. Original:
Zitat:
[#] Laufwerk C (Festplatte)
HandleError = 0
SmartVersionError = 1117
SmartDataError = 1117
[#] Laufwerk D (Festplatte)
HandleError = 0
SmartVersionError = 1117
SmartDataError = 1117
[#] Laufwerk E
HandleError = 0
SmartVersionError = 1
SmartDataError = 1
[#] Laufwerk O (Festplatte)
HandleError = 0
SmartVersionError = 1117
SmartDataError = 1117
[#] Laufwerk U (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5
[#] Laufwerk V (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5
[#] Laufwerk W (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5
[#] Laufwerk X (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5
[#] Laufwerk Y (Festplatte)
HandleError = 0
SmartVersionError = 5
SmartDataError = 5

Nach der Korrektur (0 zurückliefern, wenn Rückgabewert True war):
Zitat:
[#] Laufwerk C (Festplatte)
HandleError = 0
SmartVersionError = 1117
SmartDataError = 1117
[#] Laufwerk D (Festplatte)
HandleError = 0
SmartVersionError = 1117
SmartDataError = 1117
[#] Laufwerk E
HandleError = 0
SmartVersionError = 1
SmartDataError = 1
[#] Laufwerk O (Festplatte)
HandleError = 0
SmartVersionError = 1117
SmartDataError = 1117
[#] Laufwerk U (Festplatte)
HandleError = 0
SmartVersionError = 0
SmartDataError = 0
[#] Laufwerk V (Festplatte)
HandleError = 0
SmartVersionError = 0
SmartDataError = 0
[#] Laufwerk W (Festplatte)
HandleError = 0
SmartVersionError = 0
SmartDataError = 0
[#] Laufwerk X (Festplatte)
HandleError = 0
SmartVersionError = 0
SmartDataError = 0
[#] Laufwerk Y (Festplatte)
HandleError = 0
SmartVersionError = 0
SmartDataError = 0

Es sind alles lokale Laufwerke, C, D und O sind auf einer SSD, E ist ein DVD-Brenner, U und V eine ältere SSD und die anderen liegen auf einer Festplatte.
Interessanterweise geht es mit einer der beiden SSDs.

// EDIT:
user profile iconHolgerx hat folgendes geschrieben Zum zitierten Posting springen:
Angehängt ist ein Testprogramm, welches bei mir unter Win7 Prof 64Bit wie auch unter Win8.1 HOME 64Bit die SMART-Werte der Laufwerke zurück gibt.
Das funktioniert bei mir für die Festplatte, bei der SSD wird nichts angezeigt.
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2279
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 09.06.17 08:29 
Ich weiss nicht was ihr habt, aber in der Doku zu DeviceIoControl() steht:
MSDN hat folgendes geschrieben:
Return value

If the operation completes successfully, the return value is nonzero.

If the operation fails or is pending, the return value is zero. To get extended error information, call GetLastError.

Den Anhang teste ich nachher. Und bevor die Frage aufkommen sollte: Meine Testlaufwerke sind HDD und nicht SSD.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18694
Erhaltene Danke: 1620

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 09.06.17 08:50 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Ich weiss nicht was ihr habt, aber in der Doku zu DeviceIoControl() steht
Eben drum, du machst es nicht wie es dort steht.

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
MSDN hat folgendes geschrieben:
Return value

If the operation completes successfully, the return value is nonzero.

If the operation fails or is pending, the return value is zero. To get extended error information, call GetLastError.

Dort steht, dass die Unterscheidung, ob die Funktion erfolgreich war, am Rückgabewert hängt (eigentlich auch logisch), und im Fehlerfall GetLastError benutzt werden kann um Details zu bekommen. Du benutzt GetLastError aber als Indikator, ob die Funktion erfolgreich war. Und das funktioniert nicht, weder laut Doku noch (siehe meine Ergebnisse) in der Realität.

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2279
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 09.06.17 10:26 
Ich habs dann falsch verstanden. So wie es geschrieben steht heißt es:
Gelingt die Operation/Methode, wird ungleich 0 geliefert PUNKT
Gelingt die Methode nicht, wird 0 geliefert PUNKT
Um genaue Fehlerinforamtionen zu bekommen, rufe GetLastError auf.

Jetzt kann man viel rein interpretieren, auch wenn manche Sachen erfahrungsgemäß "logisch" sind.

Die Testanwendung verlief (mit/ohne Adminrechte) negativ aus:

SmartTest

... anders als beim CrystalDiskInfo:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
OS : Windows 7 Home Premium SP1 [6.1 Build 7601] (x64)

----------------------------------------------------------------------------
 (1) WDC WD10EZEX-00ZF5A0
----------------------------------------------------------------------------
           Model : WDC WD10EZEX-00ZF5A0
        Firmware : 80.00A80
   Serial Number : // auskommentiert
       Disk Size : 1000,2 GB (8,4/137,4/1000,2/----)
     Buffer Size : Unbekannt
     Queue Depth : 32
    # of Sectors : 1953525168
   Rotation Rate : Unbekannt
       Interface : Serial ATA
   Major Version : ATA8-ACS
   Minor Version : ----
   Transfer Mode : SATA/600 | SATA/600
  Power On Hours : 16945 Std.
  Power On Count : 3318 mal
     Temperature : 31 C (87 F)
   Health Status : Gut
        Features : S.M.A.R.T., 48bit LBA, NCQ
       APM Level : ----
       AAM Level : ----
    Drive Letter :
----------------------------------------------------------------------------
 (2) WDC WD40EZRX-00SPEB0
----------------------------------------------------------------------------
       Enclosure : WD My Book 1230 USB Device (V=1058, P=1230, sa1) - wd
           Model : WDC WD40EZRX-00SPEB0
        Firmware : 80.00A80
   Serial Number : // auskommentiert
       Disk Size : 4000,7 GB (8,4/137,4/4000,7/4000,7)
     Buffer Size : Unbekannt
     Queue Depth : 32
    # of Sectors : 7813971633
   Rotation Rate : 5400 RPM
       Interface : USB (Serial ATA)
   Major Version : ACS-2
   Minor Version : ----
   Transfer Mode : SATA/300 | SATA/600
  Power On Hours : 1394 Std.
  Power On Count : 2204 mal
     Temperature : 25 C (77 F)
   Health Status : Gut
        Features : S.M.A.R.T., 48bit LBA, NCQ
       APM Level : ----
       AAM Level : ----
    Drive Letter : I:
----------------------------------------------------------------------------
 (3) ST3500630AS
----------------------------------------------------------------------------
       Enclosure : ST350063 0AS USB Device (V=0411, P=00A2, sp1) - st
           Model : ST3500630AS
        Firmware : 3.AAD
   Serial Number : // auskommentiert
       Disk Size : 500,1 GB (8,4/137,4/500,1/500,1)
     Buffer Size : 16384 KB
     Queue Depth : 32
    # of Sectors : 976773168
   Rotation Rate : Unbekannt
       Interface : USB (Serial ATA)
   Major Version : ATA/ATAPI-7
   Minor Version : ----
   Transfer Mode : ---- | SATA/300
  Power On Hours : 19817 Std.
  Power On Count : 7062 mal
     Temperature : 25 C (77 F)
   Health Status : Gut
        Features : S.M.A.R.T., 48bit LBA, NCQ
       APM Level : ----
       AAM Level : ----
    Drive Letter : T:


Die Messwerte habe ich ausgelassen und nur die Details aufgelistet, damit man sieht, dass es sich hierbei um (HDD) Festplatten handelt und wie sie angeschlossen sind.
Einloggen, um Attachments anzusehen!
_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18694
Erhaltene Danke: 1620

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 09.06.17 10:44 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Ich habs dann falsch verstanden. So wie es geschrieben steht heißt es:
Da hast du aber die Absätze weggelassen. Die trennen das ganze ja schon einmal. Und dazu kommt, dass man ja nur für Fehlerinformation GetLastError nutzen soll und für nix anderes.
Egal, das gilt ja für die ganze API, jetzt weißt du es ja. ;-)

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
... anders als beim CrystalDiskInfo:
Dann setze doch einfach mal einen Haltepunkt auf DeviceIoControl und schaue was das Tool da so alles aufruft...
Jedenfalls keine der hier bisher genannten Funktionen... wenn ich das so sehe, greift das Ding direkt auf die ATA Schnittstelle zu, es wird nur genutzt:
IOCTL_DISK_GET_DRIVE_GEOMETRY, IOCTL_SCSI_MINIPORT, IOCTL_ATA_PASS_THROUGH, IOCTL_STORAGE_QUERY_PROPERTY, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
Crystal

Ein Blick in den Quelltext lohnt dann wohl doch. ;-)
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2279
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 09.06.17 11:16 
Jetzt weiss ich es besser, dank Holgerx und dir. :zustimm:
Einen Blick auf den CrystalDiskInfo Quelltext habe ich schon geworfen, ist etwas mühsam zu lesen, da viele Abfragen zum OS, Hersteller ... erfolgen, bevor man zu den SMART Attributen kommt.
Dank den Testanwendungen weiss ich nun woran ich bin, und wo ich anknüpfen muss. Ist doch auch etwas. ;)

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: Sa 10.06.17 20:31 
Hier gefunden:
www.delphipraxis.net...ntraeger-wmi_sql.zip

CIMV2 - CIM_MediaAccessDevice
Win32_DiskDrive - Capabilities - CapabilityDescriptions

Ausgabe (teilweise):
instance of Win32_DiskDrive
{BytesPerSector = 512;
Capabilities = {3, 4, 10}; // 10 = SMART Notification
CapabilityDescriptions = {"Random Access", "Supports Writing", "SMART Notification"};

Das geht auch im CMD-Fenster (Als Administrator ausführen) :
wmic diskdrive get capabilities, capabilitydescriptions, caption, status
Ausgabe-Beispiel:
Capabilities CapabilityDescriptions Caption Status
{3, 4} {"Random Access", "Supports Writing"} LogiLink SCSI Disk Device OK
{3, 4, 10} {"Random Access", "Supports Writing", "SMART Notification"} ST2000LM003 HN-M201RAD OK
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2279
Erhaltene Danke: 419

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 11.06.17 09:07 
Für den Link brauche ich leider einen Account, daher selber ausprobiert:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
uses
  ActiveX, WbemScripting_TLB; // Typbibliothek importieren -> "Microsoft WMI Scripting ..."

// ...

const
  DD_OUT = '%s - [ %s]%s';
var
  locator: ISWbemLocator;
  service: ISWbemServices;
  objSet: ISWbemObjectSet;
  cmd, cap, output: string;
  enum: IEnumVariant;
  rgvar: OleVariant; // var Parameter von "enum"
  pceltFetched: DWord; // out Parameter von "enum"
  i: integer;
begin
  cmd := 'SELECT Model,Capabilities FROM Win32_DiskDrive';
  locator := CoSWbemLocator.CreateRemote('----'); // Computername
  if locator <> nil then
  begin
    service := locator.ConnectServer(''''''''''''0nil);
    objSet := service.ExecQuery(cmd, 'WQL'0nil);
    enum := IEnumVariant(objSet._NewEnum);
    output := '';
    while enum.Next(1, rgvar, pceltFetched) = 0 do
    begin
      // Workaround, weil Length(rgvar.Capabilities) Probleme macht (EOleException)
      // rgvar.Capabilities = VariantArray
      try
        i := 0;
        cap := '';
        while not VarIsNull(rgvar.Capabilities[i])  do
        begin
          cap := cap + VarToStr(rgvar.Capabilities[i]) + ' ';
          i := i + 1;
        end;
      except
      end;

      output := output + Format(DD_OUT, [rgvar.Model, cap, #13]);
    end;
    rgvar := Unassigned;
    ShowMessage(output);
  end;
end;

Siehe: Win32_DiskDrive (class)

Die Kommandozeile (cmd.exe mit Adminrechten) gibt das gleiche Ergebnis wieder: 3,4. Eine 10 ist nicht dabei.
Die WMI Klasse ist interessant. Ich würde es gern mit WinAPI lösen.
Und danke für die Bereitschaft, t.roller!

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 118
Erhaltene Danke: 34



BeitragVerfasst: So 11.06.17 11:00 
Andere Version (ohne WbemScripting_TLB)

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
uses ...Winapi.ActiveX, System.Win.ComObj, ...

procedure MM(s:string); begin Form1.Memo1.Lines.Add(s); end;

function VarToInt(const AVariant: Variant): integer;
begin Result := StrToIntDef(Trim(VarToStr(AVariant)), 0); end;

procedure  GetCIM_MediaAccessDeviceInfo;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
  I : Integer;
  Data : array of WORD;
  params: OleVariant;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM CIM_MediaAccessDevice','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    MM(Format('Availability                   %d',[VartoInt(FWbemObject.Availability)]));// Uint16
//    MM(Format('Capabilities                   %d',[VartoInt(FWbemObject.Capabilities)]));// Array of Uint16
//    MM(Format('CapabilityDescriptions         %s',[VartoStr(FWbemObject.CapabilityDescriptions)]));// Array of String
      if not VarIsNull(FWbemObject.Capabilities) then
      begin
        Data := FWbemObject.Capabilities;
        for I:= VarArrayLowBound(data,1to VarArrayHighBound(data,1do
          MM('Capabilities: '+IntToStr(Data[I]));// Array of WORD /Uint16
      end;

      if not VarIsNull(FWbemObject.CapabilityDescriptions) then
      begin
        Params := FWbemObject.CapabilityDescriptions;
        for I:= VarArrayLowBound(Params,1to VarArrayHighBound(Params,1do
          MM('CapabilityDescriptions: '+ VarToStr(Params[I]));// Array of VarToStr
      end;

    MM(Format('Caption                        %s',[VartoStr(FWbemObject.Caption)]));// String
    MM(Format('CompressionMethod              %s',[VartoStr(FWbemObject.CompressionMethod)]));// String
    MM(Format('ConfigManagerErrorCode         %d',[VartoInt(FWbemObject.ConfigManagerErrorCode)]));// Uint32
    MM(Format('ConfigManagerUserConfig        %s',[VartoStr(FWbemObject.ConfigManagerUserConfig)]));// Boolean
    MM(Format('CreationClassName              %s',[VartoStr(FWbemObject.CreationClassName)]));// String
    MM(Format('DefaultBlockSize               %d',[VartoInt(FWbemObject.DefaultBlockSize)]));// Uint64
    MM(Format('Description                    %s',[VartoStr(FWbemObject.Description)]));// String
    MM(Format('DeviceID                       %s',[VartoStr(FWbemObject.DeviceID)]));// String
    MM(Format('ErrorCleared                   %s',[VartoStr(FWbemObject.ErrorCleared)]));// Boolean
    MM(Format('ErrorDescription               %s',[VartoStr(FWbemObject.ErrorDescription)]));// String
    MM(Format('ErrorMethodology               %s',[VartoStr(FWbemObject.ErrorMethodology)]));// String
    MM(Format('InstallDate                    %s',[VartoStr(FWbemObject.InstallDate)]));// Datetime
    MM(Format('LastErrorCode                  %d',[VartoInt(FWbemObject.LastErrorCode)]));// Uint32
    MM(Format('MaxBlockSize                   %d',[VartoInt(FWbemObject.MaxBlockSize)]));// Uint64
    MM(Format('MaxMediaSize                   %d',[VartoInt(FWbemObject.MaxMediaSize)]));// Uint64
    MM(Format('MinBlockSize                   %d',[VartoInt(FWbemObject.MinBlockSize)]));// Uint64
    MM(Format('Name                           %s',[VartoStr(FWbemObject.Name)]));// String
    MM(Format('NeedsCleaning                  %s',[VartoStr(FWbemObject.NeedsCleaning)]));// Boolean
    MM(Format('NumberOfMediaSupported         %d',[VartoInt(FWbemObject.NumberOfMediaSupported)]));// Uint32
    MM(Format('PNPDeviceID                    %s',[VartoStr(FWbemObject.PNPDeviceID)]));// String
//    MM(Format('PowerManagementCapabilities    %d',[VartoInt(FWbemObject.PowerManagementCapabilities)]));// Array of Uint16
      if not VarIsNull(FWbemObject.PowerManagementCapabilities) then
      begin
        Data := FWbemObject.PowerManagementCapabilities;
        for I:= VarArrayLowBound(data,1to VarArrayHighBound(data,1do
          MM('PowerManagementCapabilities: '+IntToStr(Data[I]));// Array of WORD /Uint16
      end;
    MM(Format('PowerManagementSupported       %s',[VartoStr(FWbemObject.PowerManagementSupported)]));// Boolean
    MM(Format('Status                         %s',[VartoStr(FWbemObject.Status)]));// String
    MM(Format('StatusInfo                     %d',[VartoInt(FWbemObject.StatusInfo)]));// Uint16
    MM(Format('SystemCreationClassName        %s',[VartoStr(FWbemObject.SystemCreationClassName)]));// String
    MM(Format('SystemName                     %s',[VartoStr(FWbemObject.SystemName)]));// String

    MM('---------------------------------------------------------------------');
    FWbemObject:=Unassigned;
  end;
end;


Ausgabe (teilweise):
Availability 0
Capabilities: 3
Capabilities: 4
Capabilities: 10
CapabilityDescriptions: Random Access
CapabilityDescriptions: Supports Writing
CapabilityDescriptions: SMART Notification
Caption ST2000LM003 HN-M201RAD
CompressionMethod
ConfigManagerErrorCode 0
ConfigManagerUserConfig False
CreationClassName Win32_DiskDrive
DefaultBlockSize 0
Description Laufwerk
DeviceID \\.\PHYSICALDRIVE0
---------------------------------------------------
Availability 0
Capabilities: 3
Capabilities: 4
CapabilityDescriptions: Random Access
CapabilityDescriptions: Supports Writing
Caption Intenso External USB 3.0 SCSI Disk Device
CompressionMethod
ConfigManagerErrorCode 0
ConfigManagerUserConfig False
CreationClassName Win32_DiskDrive
DefaultBlockSize 0
Description Laufwerk
DeviceID \\.\PHYSICALDRIVE1

Für diesen Beitrag haben gedankt: Frühlingsrolle