Die WinAPI OpenFile-Funktion gibt HFILE zurück und GetFileTime benötigt beispielsweise HANDLE. Wenn ich es mit (HANDLE) some_hFile füttere, scheint es gut zu funktionieren. Gibt es einen Unterschied bei diesen Typen, oder ist einer davon einfach rudimentär?Was ist der Unterschied zwischen HANDLE und HFILE in WinAPI?
Antwort
OpenFile ist eine 16-Bit-Abwärtskompatibilität von Windows. CreateFile ist die Funktion zum Öffnen von Dateien.
Wenn die Funktion erfolgreich ist, dann ist HFILE eine Datei HANDLE. Wenn nicht, dann ist es eine HFILE_ERROR-Konstante (vermutlich -1). Der Punkt ist, dass es bei einem Fehler kein HANDLE sein kann, also geben sie etwas zurück, das entweder ein HANDLE oder ein Fehlerwert sein kann.
Siehe @ Barry Vorschlag auch.
Das OpenFile gibt ein Dateihandle zurück, falls erfolgreich, oder ein HFILE_ERROR, falls es fehlschlägt.
Um Ihre Frage zu beantworten, ist HANDLE nur eine vorzeichenlose 32-Bit-Nummer, die als PVOID definiert ist. Es ist ein generisches Handle. HFILE ist ein spezielles Handle, obwohl es als 32-Bit-Zahl mit Vorzeichen definiert ist, um den Wert -1 erhalten zu können.
Es gibt andere spezialisierte Handles, wie HACCEL, HBITMAP, HINSTANCE usw., alle definiert als eine Abhängigkeit zu HANDLE.
Vor Jahren, HANDLES
waren 16-Bit int
s. Alle Handles überall in Windows waren HANDLES
. Dann erkannte jemand, dass eine Datei HANDLE
war nicht ganz die gleiche Sache wie ein Fenster HANDLE
, und wenn sie anders definiert wurden, wie HFILE
und HWND
, dann vielleicht Entwickler würden sie nicht versehentlich so viel austauschen. (Sie waren jedoch beide typedef
'ed to int
).
Noch später jemand erkannte, dass, wenn sie vollständig defferently definiert wurden ... sagen wie:
typedef struct _hfile {} * HFILE;
typedef struct _hwnd {} * HWND;
dann der Compiler selbst würde sich beschweren, wenn Sie eine anstelle der anderen verwendet werden, auch wenn in der Realität , jeder war nur ein einfacher alter 16-Bit (schließlich 32-Bit) int
Wert.
- 1. Was ist der Unterschied zwischen GetLongPathName und GetFullPathName in WinAPI?
- 2. Was ist der Unterschied zwischen `==` und `ist`?
- 3. Was ist der Unterschied zwischen/* ... */und/** ... */
- 4. Was ist der Unterschied zwischen + = und = +?
- 5. Was ist der Unterschied zwischen $ (()) und Ausdruck?
- 6. Was ist der Unterschied zwischen:.! und: r !?
- 7. Was ist der Unterschied zwischen Verilog! und ~?
- 8. Was ist der Unterschied zwischen Difftime und '-'?
- 9. Was ist der Unterschied zwischen $ und $$?
- 10. was ist der Unterschied zwischen [[], []] und [[]] * 2
- 11. Was ist der Unterschied zwischen `&` und `ref`?
- 12. Was ist der Unterschied zwischen $ (...) und `...`
- 13. Was ist der Unterschied zwischen .Equals und ==
- 14. Was ist der Unterschied zwischen "$^N" und "$ +"?
- 15. Was ist der Unterschied zwischen? und ? = Nil
- 16. Was ist der Unterschied zwischen:
- 17. Was ist die Beziehung zwischen WinAPI und .NET?
- 18. Was ist der Unterschied zwischen: und :: und ::: in Javascript Grammatik
- 19. Was ist der Unterschied zwischen add und [] in der Wörterbuchoperation
- 20. Was ist der Unterschied zwischen `-Contains` und` -In` in PowerShell?
- 21. Was ist der Unterschied zwischen der JSP und der JSTL?
- 22. Was ist der Unterschied zwischen ist - (void) und + (void) Methoden
- 23. Was ist der Unterschied zwischen PS1 und PROMPT_COMMAND ist
- 24. Was ist der Unterschied zwischen Task.Run ist() und Task.Factory.StartNew()
- 25. Was ist der Unterschied zwischen NetFx45WebLink und NetFx45RedistLink ist
- 26. Was ist der Unterschied zwischen .replace und -replace in Powershell?
- 27. Was ist der Unterschied zwischen Cholesky in numpy und scipy?
- 28. Was ist der Unterschied zwischen DataTemplate und DataContext in WPF?
- 29. In ASP.Net, was ist der Unterschied zwischen <% = und <% #
- 30. Was ist der Unterschied zwischen Ereignissen in VB und C#?