AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Type _OSVERSIONINFOA - Verständnisproblem

Type _OSVERSIONINFOA - Verständnisproblem

Ein Thema von Mazel · begonnen am 8. Mai 2007 · letzter Beitrag vom 10. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#1

Type _OSVERSIONINFOA - Verständnisproblem

  Alt 8. Mai 2007, 17:21
Hallo,

Ich habe ein kleines Verständisproblem mit der Typ-Deklaration von verschiedenen Typen. Weil ich gerade TOSVersionInfo gebraucht habe, nehme ich dies als Beispiel:
In der Windows.pas ist _OSVERSIONINFOA folgendermaßen deklariert:
Delphi-Quellcode:
type
  POSVersionInfoA = ^TOSVersionInfoA;
  POSVersionInfoW = ^TOSVersionInfoW;
  POSVersionInfo = POSVersionInfoA;
  _OSVERSIONINFOA = record
    dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    szCSDVersion: array[0..127] of AnsiChar; { Maintenance string for PSS usage } 
  end;

  _OSVERSIONINFO = _OSVERSIONINFOA;
  TOSVersionInfoA = _OSVERSIONINFOA;
  TOSVersionInfoW = _OSVERSIONINFOW;
  TOSVersionInfo = TOSVersionInfoA;
  OSVERSIONINFOA = _OSVERSIONINFOA;
Nun, zunächst wollte ich wissen, was das 'A' und das 'W' bedeutet? Ich nehme an Ansi und Wide aber warum wird das getrennt behandelt?

Desweiteren verstehe ich nicht, warum der eigentliche Type _OSVersionInfoA so oft "hin und her" gesetzt wird. Also warum ist nicht
TOSVersionInfo = _OSVERSIONINFOA sondern erst
TOSVersionInfoA = _OSVERSIONINFOA und TOSVersionInfo = TOSVersionInfoA?

Ich hoffe mir kann jemand eine Antwort geben.

Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
CCRDude
(Gast)

n/a Beiträge
 
#2

Re: Type _OSVERSIONINFOA - Verständnisproblem

  Alt 8. Mai 2007, 18:27
Das wird getrennt behandelt, weil die Windows-API das auch getrennt behandelt (sehr viele Funktionsaufrufe heißen auch FunktionsnameA und FunktionsnameW, wobei dann FunktionsnameA auch als Funktionsname verwendet wird).

Und das Namenshickhack mit mehreren Namen für denselben Typ hängt wahrscheinlich damit zusammen, daß die großgeschriebene Variante erst einmal die direkte Übersetzung aus einem C-Header ist (so kann man mal eben auch ein C-Beispiel direkt übersetzen, ohne erst den komfortableren Pascal-Namen zu kennen), und die Variante mit T und Groß-/Kleinschreibung danach noch einmal für bessere Lesbarkeit, der Pascal-Schreiber ist da schließlich verwöhnt
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#3

Re: Type _OSVERSIONINFOA - Verständnisproblem

  Alt 9. Mai 2007, 13:35
Das heißt also eigentlich für mich, dass ich ohne Problem gleich folgendes schreiben könnte:
Delphi-Quellcode:
type
  TOSVersionInfo = record
    dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    szCSDVersion: array[0..127] of AnsiChar; { Maintenance string for PSS usage } 
  end;
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Type _OSVERSIONINFOA - Verständnisproblem

  Alt 9. Mai 2007, 15:08
Ja, was dann aber explizit der Ansi Variante entspricht. Die Wide Variante hätte am Ende ein Array of WideChar und somit einen doppelt so grosses Member an der Stelle.
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Type _OSVERSIONINFOA - Verständnisproblem

  Alt 9. Mai 2007, 15:32
Bei solchen "dann kann ich ja einfach"-Aktionen bitte immer auch bedenken dass es Systeme gibt, auf denen die Variante ohne Suffix eben NICHT die Ansi- sondern die Wideversion ist. Wenn also Code geschrieben wird der auf mehr als dem eigenen Rechner zuhause laufen soll, dann lieber die vorhandenen Typen nehmen, man spart sich später dann viel Aufwand. Nebenbei sind die Wideversionen auf WinNT aufwärts per se (wenn auch marginal) schneller, weil der Kernel immer mit Widetypen arbeitet und für die Ansi-Aufrufe nochmals Wandlungen zwischen Ansi und Wide und wieder zurück notwendig werden.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#6

Re: Type _OSVERSIONINFOA - Verständnisproblem

  Alt 9. Mai 2007, 16:32
So ganz verstanden habe ich deine Aussage nicht, genauer, den ersten Teil. Das mit den Umwandlungen ist klar, aber nicht
Zitat von OldGrumpy:
[..], dass es Systeme gibt, auf denen die Variante ohne Suffix eben NICHT die Ansi- sondern die Wideversion ist.
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.188 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Type _OSVERSIONINFOA - Verständnisproblem

  Alt 9. Mai 2007, 16:36
Zitat von Mazel:
So ganz verstanden habe ich deine Aussage nicht, genauer, den ersten Teil. Das mit den Umwandlungen ist klar, aber nicht
Zitat von OldGrumpy:
[..], dass es Systeme gibt, auf denen die Variante ohne Suffix eben NICHT die Ansi- sondern die Wideversion ist.
Wenn du mal mit einem Delphi-64-Bit-Compiler compilieren willst könnte es probleme geben. Dort gibt es AFAIK keine ANSI-Versionen der API mehr.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#8

Re: Type _OSVERSIONINFOA - Verständnisproblem

  Alt 9. Mai 2007, 16:40
Wenn ich jetzt aber als Beispiel die WindowsVersion ermitteln will verwende ich doch trotzdem TOSVersionInfo, der aber für Ansi angeführt ist, wie komme ich dann zu der Wide-Version?
Ich denke, hier im Forum nur den Type TOSVersionInfo für Ansi zu finden.
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Type _OSVERSIONINFOA - Verständnisproblem

  Alt 9. Mai 2007, 16:55
Kleines Beispiel: Wenn ich ein japanisches Windows nehme, dann sind da API-Aufrufe ohne Suffix generell die Wide-Varianten. Man erspart sich viel Arbeit für die Zukunft wenn man so früh wie möglich komplett auf Widetypen umsteigt - Die nötigen Wandlungen macht bei Delphi eh fast immer Compilermagic. Dafür laufen die Programme dann auch ohne viel Klimmzüge in exotischen Umgebungen Der Kernel arbeitet intern eh immer mit Widetypen und konvertiert für die Ansi-APIs transparent hin und her. Das kostet zwar nur marginal Zeit, aber... Ganz fiese Stolperfalle sind allerdings APIs die in Ansi und Wide unterschiedliche Parameter erwarten (ja, sowas gibts!), immer lieber nochmal in der MSDN nachschauen. Ich stell meinen alten Code Stück für Stück auf Wide um, immer wenn ich mal wieder ne Funktion oder Klasse recycle, wird die gleich entsprechend umgebaut. Win 9x-Kompatibilität ist bei meinen Projekten gottseidank gar kein Thema. Das ist gleichzeitig auch wohl fast der einzige Grund, überhaupt noch mit den Ansitypen zu arbeiten.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#10

Re: Type _OSVERSIONINFOA - Verständnisproblem

  Alt 9. Mai 2007, 17:23
Der Grund für die Frage ist eigentlich nur, dass ich ein kleine Funktion schreiben will, die ermittelt, ob das vorhandene System NT-Plattform ist oder nicht. Da GetVersionEx die einzigste Funktion aus der Windows.pas wär, wollte ich sie in meine Unit aufnehmen. Dazu auch den Typ. NUn dachte ich, ich könnte das so machen:
Delphi-Quellcode:
type
  TOSVersionInfo = record
    dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    szCSDVersion: array[0..127] of AnsiChar;
  end;
.
.
function GetVersionEx(var lpVersionInformation: TOSVersionInfo): LongBool; stdcall;
.
.
implementation

function GetVersionEx; external 'kernel32.dllname 'GetVersionExA';
Würde das so also nicht auf anderen System möglicher Weise funktionieren? Stattdessen sollte ich
Delphi-Quellcode:
szCSDVersion: array[0..127] of WideChar;
.
.
function GetVersionEx; external 'kernel32.dllname 'GetVersionExW';
verwenden?
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.
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