{"id":55000069,"date":"2002-06-01T00:00:00","date_gmt":"2021-02-10T20:12:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=69"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Tipps_und_Tricks_zur_API","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/","title":{"rendered":"Tipps und Tricks zur API"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/16912907727e49eabe87f4f93c5b1d8f\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Autor: Christoph Spielmann, D&uuml;sseldorf<\/p>\n<p><\/b><\/p>\n<p><b>Bei der Windows-API (Application Programmers Interface) handelt es sich um eine m&auml;chtige Bibliothek von Funktionen, die Ihnen den Zugang zu Windows-internen Ressourcen erm&ouml;glichen. Unser Autor Christoph Spielmann hat f&uuml;r den vorliegenden Beitrag in seinen umfangreichen Erfahrungsschatz gegriffen, um Ihnen anhand einiger Beispiele die M&ouml;glichkeiten der API zu er&ouml;ffnen.<\/b><\/p>\n<p>Tempor&auml;re Dateien werden von Anwendungen vor&uuml;bergehend angelegt, um verschiedene Daten, Zust&auml;nde oder gerade in Bearbeitung befindliche Dokumente zwischenzuspeichern.<\/p>\n<p>Es ist zwar kein Muss, aber als allgemeine &uuml;bereinkunft gilt, einen im System als speziell f&uuml;r diesen Zweck deklarierten Ordner zur Ablage von tempor&auml;ren Dateien zu verwenden &#8211; den TEMP-Ordner.<\/p>\n<p>Windows stellt dazu sogar eine eigene API-Funktion bereit, &uuml;ber die Sie den Pfad dieses Ordners ermitteln k&ouml;nnen (Gesucht &#8211; Systemordner). Und wie der Name es sagt: Tempor&auml;re Dateien sind ihrer Natur nach verg&auml;nglich &#8211; Ihre Anwendungen sollten daher auch daf&uuml;r sorgen, dass sie von Ihnen angelegte tempor&auml;re Dateien sp&auml;testens beim Beenden wieder l&ouml;schen.<\/p>\n<pre>Declare Function GetTempFileName Lib \"kernel32\" Alias \"GetTempFileNameA\" (ByVal _    pszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, _\r\n    ByVal lpTempFileName As String) As Long<\/pre>\n<p><b>Quellcode 1<\/b><\/p>\n<p>Wenn Sie f&uuml;r Ihr Programm eine tempor&auml;re Datei erzeugen wollen, brauchen Sie einen eindeutigen Dateinamen. Denn schlie&szlig;lich legen ja auch andere Anwendungen im TEMP-Ordner ihre Dateien ab, sodass es leicht zu Namenskonflikten kommen k&ouml;nnte.<\/p>\n<p>Sie k&ouml;nnten nat&uuml;rlich einfach einen beliebigen Dateinamen w&auml;hlen und f&uuml;r den Fall, dass eine Datei dieses Namens bereits existieren sollte, in einer Schleife einen neuen Dateinamen kreieren, bis Sie einen freien gefunden haben. <\/p>\n<p>Doch besser ist wie immer der Weg, die speziell daf&uuml;r bereitgestellte API-Funktion GetTempFileName (s. Quellcode 1) zu verwenden. Der Funktion werden vier Parameter &uuml;bergeben.<\/p>\n<p>Im ersten Parameter, lpszPath &uuml;bergeben Sie den Pfad, in dem der tempor&auml;re Dateiname angelegt werden soll, vorzugsweise den des TEMP-Ordners.<\/p>\n<p>In lpPrefixString &uuml;bergeben Sie einen aus bis zu drei Zeichen bestehenden Pr&auml;fix, den Sie dem Dateinamen voranstellen m&ouml;chten. Damit k&ouml;nnen Sie gewisserma&szlig;en eine Anwendung individuell hervorheben. Sie k&ouml;nnen nat&uuml;rlich auch ganz normal ein &#8222;tmp&#8220; &uuml;bergeben.<\/p>\n<pre>Private Declare Function GetTempFileName _    Lib \"kernel32\" Alias \"GetTempFileNameA\" _    (ByVal lpszPath As String, ByVal lpPrefixString As _    String, ByVal wUnique As Long, _    ByVal lpTempFileName As String) As Long \r\nPrivate Declare Function GetTempPath Lib \"kernel32\" _    Alias \"GetTempPathA\" (ByVal BufferLength As Long, _    ByVal lpBuffer As String) As Long\r\nPrivate Const kLength = 255\r\nPublic Function CreateTempFile(Optional Prefix As _    String = \"tmp\", Optional TempPath As String) _    As String\r\n    Dim nBuffer, nTempPath As String\r\n    Dim nReturn, nPosEnd As Long\r\n    If Len(TempPath) = 0 Then\r\n        nBuffer = Space(kLength)\r\n        nReturn = GetTempPath(kLength, nBuffer)\r\n        If nReturn &gt; 0 Then\r\n            nTempPath = Left(nBuffer, nReturn)\r\n        Else\r\n            nTempPath = CurDir$\r\n            If Right$(nTempPath, 1) &lt;&gt; \"\\\" Then\r\n                nTempPath = nTempPath & \"\\\"\r\n            End If\r\n        End If\r\n    Else\r\n        nTempPath = TempPath\r\n    End If\r\n    nBuffer = Space(kLength)\r\n    nReturn = GetTempFileName(nTempPath, Left$(Prefix, _        3), 0&, nBuffer)\r\n    If nReturn &lt;&gt; 0 Then\r\n        nPosEnd = InStr(nBuffer, Chr$(0))\r\n        If nPosEnd = 0 Then\r\n            CreateTempFile = nBuffer\r\n        Else\r\n            CreateTempFile = Left(nBuffer, nPosEnd - 1)\r\n        End If\r\n    End If\r\nEnd Function<\/pre>\n<p><b>Quellcode 2<\/b><\/p>\n<p>Um den Parameter wUnique brauchen Sie sich nicht unbedingt zu k&uuml;mmern. Hier k&ouml;nnten Sie Ihrer tempor&auml;ren Datei eine von Ihrer Anwendung selbst generierte und verwaltete Nummer geben. &uuml;bergeben Sie 0, erzeugt Windows selbst eine eindeutige Zahl anhand der Systemzeit.<\/p>\n<p>Im Puffer lpTempFileName liefert Ihnen die Funktion den erzeugten Dateinamen zur&uuml;ck.<\/p>\n<p>Die Funktion CreateTempFile (s. Quellcode 3) verpackt den Aufruf auf VBA-gerechte und einfach zu handhabende Weise.<\/p>\n<p>Beide Parameter sind optional. Verzichten Sie auf den individuellen Pr&auml;fix, wird &#8222;tmp&#8220; als Pr&auml;fix verwendet. Lassen Sie die Pfadangabe weg, wird die Datei automatisch im TEMP-Ordner des Systems angelegt. Dazu wird hier die API-Funktion GetTempPath (s. Quellcode 2) direkt aufgerufen (Gesucht Systemordner). Konnte aus irgendeinem Grund keine tempor&auml;re Datei angelegt werden, wird ein leerer String zur&uuml;ckgegeben.<\/p>\n<p>Beachten Sie, dass der Aufruf der API-Funktion GetTempFileName (s. Quellcode 2) auf jeden Fall eine Datei anlegt, die Sie nach Gebrauch oder Nichtgebrauch wieder ordnungsgem&auml;&szlig; l&ouml;schen sollten. Dieses Funktionalit&auml;t der API-Funktion ist sinnvoll, da nach der Ermittlung eines unverwendeten Dateinamens dieser unter Umst&auml;nden doch schon nicht mehr frei sein k&ouml;nnte, wenn Sie selbst nur Sekunden sp&auml;ter eine Datei dieses Namens anzulegen versuchten.<\/p>\n<pre>Function CreatePathDeep(NewPath As String) As Boolean\r\n    Dim nNewPath As String\r\n    Dim nStart As Integer\r\n    nNewPath = Trim$(NewPath)\r\n    If Left$(nNewPath, 2) = \"\\\\\" Then\r\n        If Len(nNewPath) &gt; 6 Then\r\n            nStart = 7\r\n        Else\r\n            Exit Function\r\n        End If\r\n    ElseIf Mid$(nNewPath, 2, 2) = \":\\\" Then\r\n        nStart = 4\r\n    Else\r\n        Exit Function\r\n    End If\r\n    If nStart Then\r\n        Do\r\n            nPos = Instr(nStart, nNewPath, \"\\\")\r\n            If nPos Then\r\n                On Error Resume Next\r\n                MkDir Left$(nNewPath, nPos - 1)\r\n                On Error GoTo 0\r\n            Else\r\n                On Error Resume Next\r\n                MkDir nNewPath\r\n                If Err.Number = 0 Then\r\n                    CreatePathDeep = True '' Erfolg\r\n                End If\r\n                On Error GoTo 0\r\n            End If\r\n        Loop While nPos\r\n    End If\r\nEnd Function<\/pre>\n<p><b>Quellcode 3<\/b><\/p>\n<p>Ein neuer Ordner in einem tief verschachtelten Pfad kann mit der VBA-Funktion MkDir nur dann angelegt werden, wenn der Pfad selbst bereits vorhanden ist. Anderenfalls ist es in VBA eine recht m&uuml;hselige Angelegenheit.<\/p>\n<p>Wollten Sie beispielsweise den Pfad c:\\abc\\def\\ghi anlegen, wenn selbst c:\\abc noch nicht existiert, s&auml;he das etwa so aus:<\/p>\n<pre>On Error Resume Next\r\nMkDir \"c:\\abc\"\r\nMkDir \"c:\\abc\\def\"\r\nMkDir \"c:\\abc\\def\\ghi\"\r\nOn Error GoTo 0<\/pre>\n<p>Direkt an Ort und Stelle im Code platziert ist das schon recht aufw&auml;ndig. Es w&uuml;rde allerdings noch aufwendiger, wenn Sie diese Codezeilen als allgemein verwendbare Funktion implementieren wollten (s. Quellcode 3).<\/p>\n<p>F&uuml;r Windows-Versionen vor Windows 98 werden Sie nicht darum herum kommen, eine solche oder &auml;hnliche Funktion auf diese Weise zu implementieren. Ab Windows 98 und unter Windows NT k&ouml;nnen Sie jedoch eine API-Funktion aus einer der System-DLLs (imagehlp.dll) verwenden.<\/p>\n<p><!--30percent--><\/p>\n<p>Die Funktion MakeSureDirectoryPathExists (s. Quellcode 4) h&auml;lt, was ihr Name verspricht. Sie stellt sicher, dass der als Parameter &uuml;bergebene Pfad nach ihrem Aufruf tats&auml;chlich existiert &#8211; selbst wenn sie ihn erst anlegen muss. Das hei&szlig;t &#8211; sie versucht zumindest, das Versprechen zu halten.<\/p>\n<p>Nat&uuml;rlich kann auch sie nichts gegen nicht bereite Laufwerke oder Netzwerkpfade ausrichten. Und ohne die entsprechenden Berechtigungen wird auch sie keine Pfade anlegen k&ouml;nnen. Den Erfolg meldet sie mit dem R&uuml;ckgabewert 1 &#8211; bei Misserfolg ist dieser 0.<\/p>\n<pre>Private Declare Function MakeSureDirectoryPathExists _\r\n    Lib \"imagehlp.dll\" (ByVal lpPath As String) As Long<\/pre>\n<p><b>Quellcode 5<\/b><\/p>\n<pre>Public Function CreatePath(NewPath As String) As Boolean\r\n    Dim nNewPath As String\r\n        nNewPath = Trim$(NewPath)\r\n    If Right$(nNewPath, 1) &lt;&gt; \"\\\" Then\r\n        nNewPath = nNewPath & \"\\\"\r\n    Else\r\n        nNewPath = nNewPath\r\n    End If\r\n    CreatePath = _        CBool(MakeSureDirectoryPathExists(nNewPath))\r\nEnd Function<\/pre>\n<p><b>Quellcode 6<\/b><\/p>\n<p>Sie erwartet allerdings einen abschlie&szlig;enden &#8222;\\&#8220; bei der &uuml;bergabe des anzulegenden Pfades. Anderenfalls nimmt die Funktion an, dass der letzte Teil ein Dateiname sein k&ouml;nnte und legt diesen Teil daher nicht als Pfadbestandteil an.<\/p>\n<p>Und so rufen Sie diese Funktion beispielsweise auf und pr&uuml;fen den Erfolg:<\/p>\n<pre>Private Declare Function _  MakeSureDirectoryPathExists _\r\n  Lib \"imagehlp.dll\" (ByVal lpPath As _  String) As Long\r\n  '' ...\r\n  If Not (Cbool _    (MakeSureDirectoryPathExists _    (\"c:\\abc\\def\\ghi\\\") Then\r\n      MsgBox \"Pfad konnte nicht \" _      & \"angelegt werden.\"\r\n  End If<\/pre>\n<p>Wenn Sie die Funktion ben&ouml;tigen, um beispielsweise eine Datei, deren Zielpfad und Name in einem String zusammen vorliegen, in genau diesen Zielpfad zu kopieren, k&ouml;nnen Sie sich die Sicherheitsma&szlig;nahmen dieser Funktion zunutze machen:  Sie k&ouml;nnen den Pfadstring (eben einschlie&szlig;lich des Dateinamens) an sie &uuml;bergeben, ohne ihn zuvor erst in Pfad und Dateinamen zerlegen zu m&uuml;ssen.<\/p>\n<p>Wenn Sie sich jedoch nicht bei jedem Aufruf um den abschlie&szlig;enden &#8222;\\&#8220; k&uuml;mmern wollen, verpacken Sie die API-Funktion in eine eigene Funktion, CreatePath, die automatisch den abschlie&szlig;enden &#8222;\\&#8220; hinzuf&uuml;gt, falls er fehlen sollte (s. Quellcode 6). <\/p>\n<p>Es ist kaum verwunderlich, dass eine Funktion zum Ein- und Ausfahren eines CD-Laufwerks im Multimedia-API zu finden ist &#8211; immerhin wird ein CD-Laufwerk gelegentlich zu den Multimedia-Ger&auml;ten gez&auml;hlt.<\/p>\n<p>Allerdings mutet der Umgang mit der API-Funktion mciExecute ein wenig seltsam an. So muss der auszuf&uuml;hrende Befehl im Klartext als String &uuml;bermittelt werden. Und daher muss dieser String mit der Angabe des entsprechenden CD-Laufwerks erst einmal zusammengebaut werden.<\/p>\n<p>Ein Schwachpunkt der Funktion ist, dass sie keine vern&uuml;nftige Fehlerbehandlung erm&ouml;glicht, falls etwa eine Laufwerksbezeichnung f&uuml;r ein Nicht-CD-Laufwerk angegeben worden ist oder falls das Laufwerk aus irgendeinem Grund nicht bereit ist.<\/p>\n<p>Es werden dem Anwender lediglich nichtssagende Fehlermeldungen angezeigt, die sich offensichtlich nicht per Code unterdr&uuml;cken lassen. Eine falsche Laufwerksbezeichnung k&ouml;nnen Sie jedoch schon vorab verhindern, indem Sie mittels der API-Funktion GetDriveType pr&uuml;fen, ob es sich um ein CD-Laufwerk handelt. Mittels dieser Funktion k&ouml;nnen sie zudem auch ein CD-Laufwerk ermitteln.<\/p>\n<pre>Option Compare Text\r\nPrivate Declare Function GetDriveType Lib \"kernel32\" _    Alias \"GetDriveTypeA\" (ByVal nDrive As String) As _    Long\r\nPrivate Declare Function mciExecute Lib \"winmm.dll\" _    (ByVal lpstrCommand As String) As Long\r\nPublic Function OpenCloseCD(Optional Drive As String, _\r\n    Optional ByVal OpenClose As Boolean = True, _\r\n    Optional FindFirstCDDrive As Boolean) As Boolean\r\n    Dim nDrive, nExec, nAlias, nResult As Long\r\n    Const DRIVE_CDROM = 5\r\n    If FindFirstCDDrive Then\r\n        nDrive = GetFirstCDDrive()\r\n    Else\r\n        nDrive = Trim$(Drive)\r\n        If Len(nDrive) Then\r\n            nDrive = Left$(nDrive, 1)\r\n            If nDrive Like \"[a-z]\" Then\r\n                If GetDriveType(nDrive & \":\\\") &lt;&gt; _                    DRIVE_CDROM Then\r\n                    Exit Function\r\n                End If\r\n            End If\r\n        End If\r\n    End If\r\n    If Len(nDrive) Then\r\n    nAlias = \"CDDrive\" & nDrive\r\n    nExec = \"Open \" & nDrive _        & \": Type CDAudio Alias \"  & nAlias\r\n    nResult = mciExecute(nExec)\r\n        If nResult Then\r\n            If OpenClose Then\r\n                nExec = \"Set \" & nAlias & \" Door Open\"\r\n            Else\r\n                nExec = \"Set \" & nAlias _                    & \" Door Closed\"\r\n            End If\r\n            nResult = mciExecute(nExec)\r\n            If nResult Then\r\n                nExec = \"Close \" & nAlias\r\n                nResult = mciExecute(nExec)\r\n                OpenCloseCD = True\r\n            End If\r\n        End If\r\n    End If\r\nEnd Function<\/pre>\n<p><b>Quellcode 7<\/b><\/p>\n<p>Die folgende Funktion OpenCloseCD (s. Quellcode 7) &uuml;bernimmt diese Pr&uuml;fungen und verwendet, falls kein Laufwerk angegeben und im optionalen Parameter FindFirstCDDrive True &uuml;bergeben worden ist, das erste verf&uuml;gbare CD-Laufwerk des Systems.<\/p>\n<p>Als Laufwerksbezeichnung k&ouml;nnen Sie den Laufwerksbuchstaben alleine (Gro&szlig;- oder Kleinbuchstabe), eine &uuml;bliche Laufwerksbezeichnung mit Doppelpunkt oder einen beliebigen Pfad auf der CD angeben.<\/p>\n<p>Beachten Sie, dass zur Pr&uuml;fung des Laufwerksbuchstabens unabh&auml;ngig von der Gro&szlig;-\/Kleinschreibung der VBA-Operator Like verwendet wird und dazu die Vergleichsmethode des Moduls, in dem sich die Funktion befindet, auf Textvergleich (Option Compare Text) eingestellt wird.<\/p>\n<p>Die weiter unten stehende Hilfsfunktion GetFirstCDDrive zur Ermittlung des ersten vorhandenen CD-Laufwerks k&ouml;nnen Sie nat&uuml;rlich auch f&uuml;r andere Zwecke verwenden.<\/p>\n<p>Stellen Sie sich nur einmal den L&auml;rm vor, wenn in einem Gro&szlig;raumb&uuml;ro mehrere Leute mit einer Anwendung arbeiten, die unabl&auml;ssig jede Fehleingabe, jede MessageBox, jedes &ouml;ffnen eines Dialogs und dergleichen mit einem aufgeregten Piepser oder gar einer Klang-Fanfare quittiert.<\/p>\n<pre>Public Function GetFirstCDDrive() As String\r\n  Dim i As Integer\r\n  Dim nCDDrive As String\r\n  Const DRIVE_CDROM = 5\r\n  For i = 65 To 90\r\n    nCDDrive = Chr$(i) & \":\\\"\r\n    If GetDriveType(nCDDrive) = DRIVE_CDROM Then\r\n      GetFirstCDDrive = nCDDrive\r\n      Exit For\r\n    End If\r\n  Next ''i\r\nEnd Function<\/pre>\n<p><b>Quellcode 8<\/b><\/p>\n<pre>Public LocalBeep As Boolean\r\nPublic Sub Beep()\r\n    If LocalBeep Then\r\n        VBA.Beep\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Quellcode 9<\/b><\/p>\n<pre>Private Declare Sub SystemParametersInfoGet Lib _    \"user32\" Alias \"SystemParametersInfoA\" (ByVal _    uAction As Long, ByVal uParam As Long, lpvParam As _    Any, ByVal fuWinIni As Long)\r\nPrivate Declare Sub SystemParametersInfoSet Lib _    \"user32\" Alias \"SystemParametersInfoA\" (ByVal _    uAction As Long, ByVal uParam As Long, ByVal _    lpvParam As Long, ByVal fuWinIni As Long)\r\nPrivate Const SPI_GETBEEP = 1\r\nPrivate Const SPI_SETBEEP = 2\r\nPrivate Const SPIF_SENDWININICHANGE = &H2\r\nPrivate Const SPIF_UPDATEINIFILE = &H1\r\nPublic Property Get SysBeep() As Boolean\r\n    Dim nSysBeep As Boolean\r\n        SystemParametersInfoGet SPI_GETBEEP, 0, _        nSysBeep, 0\r\n    SysBeep = nSysBeep\r\nEnd Property\r\nPublic Property Let SysBeep(ByVal New_SysBeep As _    Boolean)\r\n    SystemParametersInfoSet SPI_SETBEEP, _        CLng(New_SysBeep), 0&, _        SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE\r\nEnd Property<\/pre>\n<p><b>Quellcode 10<\/b><\/p>\n<p>Da macht es durchaus Sinn, dem Anwender die M&ouml;glichkeit zu geben, die akustische Signalisierung abzuschalten.<\/p>\n<p>Mithilfe des hier vorgestellten Moduls k&ouml;nnen Sie zum einen festlegen, nat&uuml;rlich vom Anwender einstellbar, ob die Beep-Anweisungen in Ihrer Anwendung h&ouml;rbar werden. Und zum anderen k&ouml;nnen Sie auch systemweit das Piepen ein- und ausschalten.<\/p>\n<p>Aber ganz abgesehen davon: Sie sollten die Beep-Anweisung so sparsam wie m&ouml;glich einsetzen. Denn ein Alarmsignal verliert seine alarmierende Wirkung, wenn es st&auml;ndig und andauernd ausgel&ouml;st wird. Denken Sie nur einmal an die Alarm-Anlage in Ihrer Nachbarschaft, die wegen &uuml;bersensibilit&auml;t oder wegen einer Fehlfunktion so oft anspringt, dass letztlich niemand mehr darauf achtet &#8211; auch dann nicht, wenn tats&auml;chlich einmal Einbrecher die Ursache des Alarms sein sollten.<\/p>\n<p>Das Modul modBeep.bas bietet Ihnen zum einen die M&ouml;glichkeit, die Aufrufe der Beep-Anweisung aus Ihrer Anwendung abzufangen und gegebenenfalls zu unterdr&uuml;cken. Das Prinzip ist einfach: Die &ouml;ffentliche Prozedur Beep (s. Quellcode 9) &uuml;berschreibt die originale VBA-Anweisung, die in dieser Prozedur nur dann aufgerufen wird, wenn die globale Variable LocalBeep auf True gesetzt ist. Zum anderen k&ouml;nnen Sie in diesem Modul das Beep-Signal systemweit ein- und ausschalten.<\/p>\n<p>Dazu wird die API-Funktion SystemParametersInfo (s. Quellcode 10) mit dem Index SPI_SETBEEP aufgerufen, der im zweiten Parameter die gew&uuml;nschte Einstellung &uuml;bergeben wird. Sie brauchen im Code Ihrer Anwendung lediglich die Eigenschaft SysBeep auf True oder False zu setzen. Umgekehrt liefert Ihnen diese Eigenschaft die aktuelle Einstellung im System.<\/p>\n<p>Da der dritte Parameter der API-Funktion zum Setzen als As Long mit Wert&uuml;bergabe (ByVal), zum Auslesen jedoch als As Any deklariert sein muss, damit (f&uuml;r eine API-Funktion sehr ungew&ouml;hnlich) eine Variable vom Typ Boolean &uuml;bergeben werden kann, werden hier zwei separate Alias-Deklarationen verwendet. <\/p>\n<p>Ziemlich undurchsichtig erscheinen die Informationen, die Ihnen die API-Funktion GetVersionEx &uuml;ber das installierte Betriebssystem liefert. Wom&ouml;glich kann bei Microsoft selbst niemand mehr so richtig nachvollziehen, warum sich sowohl alle Windows 9x-Versionen als auch NT 4.0 als Hauptversion 4 zu erkennen geben.<\/p>\n<p>Wahrscheinlich beruht das auf dem urspr&uuml;nglich f&uuml;r einen viel fr&uuml;heren Zeitpunkt geplanten Zusammenwachsen der Betriebssysteme auf der Basis eines gemeinsamen Kerns.<\/p>\n<p>Grunds&auml;tzlich ergibt sich die tats&auml;chliche Betriebssystem-Version aus der Kombination der Hauptversion (Major) und der Unterversion (Minor) mit der Plattform-Kennung (Plat-formID &#8211; 32s, 9x oder NT).<\/p>\n<p>Im Prinzip reicht es, von der API-Funktion GetVersionEx die benutzerdefinierte Variable OSVERSIONINFO f&uuml;llen zu lassen. Sie umfasst bereits alle zur Bestimmung des Betriebssystems notwendigen Informationen. Ein wenig mehr k&ouml;nnen allerdings die neueren Windows-Versionen &uuml;ber sich erz&auml;hlen: Windows 2000 und Windows XP &#8211; und auch schon Windows NT 4.0 ab Service Pack 6.<\/p>\n<p>Die um die erweiterten Informationen gr&ouml;&szlig;ere benutzerdefinierte Variable OSVERSIONINFOEX kann auch erst unter diesen Versionen an GetVersionEx &uuml;bergeben werden. Und gerade sie bietet erst eine systematischere Unterscheidung der Service-Pack-Stufe, sogar wiederum mit einer getrennten Kennung Haupt- und Unterversion, wie Sie sie eigentlich schon unter NT 4.0 brauchen k&ouml;nnten, um das Vorhandensein des Service Pack 6 feststellen zu k&ouml;nnen.<\/p>\n<p>Eine etwas vage anmutende Information k&ouml;nnen Sie dazu jedoch auch schon &uuml;ber OSVERSIONINFO in Erfahrung bringen. Im Element szCSDVersion (einem String der festen L&auml;nge 128) werden n&auml;mlich Zusatzinformationen geliefert &#8211; unter Windows 9x eine Kennung f&uuml;r die Release-Version (OSR, Second Edition usw.) und unter NT\/2000 die ServicePack-Stufe im Klartext. Zumindest unter NT 4.0 k&ouml;nnen sich Sie sich wohl darauf verlassen, dass die Nummer des Service Packs mit dem 14. Zeichen beginnt.<\/p>\n<p>Wir haben f&uuml;r Sie die Auswertung der Einzelinformationen in ein Standard-Modul gepackt. Sie initialisieren es einmal mit dem Aufruf der Prozedur ReadVersionInfo, in der mittels GetVersionEx die Informationen einmal eingelesen werden. &uuml;ber eine ganze Reihe von Eigenschaften k&ouml;nnen Sie nun die Details auslesen.<\/p>\n<p>Zum einen entspricht jeweils eine Eigenschaft einem jeden Element von OSVERSIONINFOEX. F&uuml;r den Fall, dass GetVersionEx jedoch nicht damit aufgerufen werden konnte, sondern lediglich mit OSVERSIONINFO, wird deren Inhalt einer modulweit g&uuml;ltigen Variablen des Typs OSVERSIONINFOEX per LSet zugewiesen.<\/p>\n<p>Zum anderen bietet das Modul eine direkte M&ouml;glichkeit, die Windows-Version als enumerierten Wert aus der Eigenschaft WinVersion auszulesen, als auch als Klartext aus der Eigenschaft WinVersionText. Schlie&szlig;lich k&ouml;nnen Sie noch &uuml;ber separate Eigenschaften f&uuml;r jede Betriebssystem-Version erfragen, ob die jeweilige Version installiert ist.<\/p>\n<h3>Hinweis<\/h3>\n<p>Den Quellcode zu diesem und zu den anderen Tipps und Tricks finden Sie im Modul modTippsUndTricks der Datenbank TippsUndTricks .mdb auf der Heft-CD. <\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>TippsUndTricks00.mdb<\/p>\n<p>TippsUndTricks97.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/4C211CFC-4322-4DC5-9C24-BCB66A6535FC\/aiu_69.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In dieser Zusammenstellung von Tipps und Tricks finden Sie die folgenden Themen:<br \/>\n&#8211; Tempor&auml;re Dateien<br \/>\n&#8211; Der Pfad ins Ungewisse<br \/>\n&#8211; CD-Rom auswerfen<br \/>\n&#8211; Nervenschoner<br \/>\n&#8211; Windows-Version detailliert ermitteln<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662002,66032002,44000004,44000025],"tags":[],"class_list":["post-55000069","post","type-post","status-publish","format-standard","hentry","category-662002","category-66032002","category-Tipps_und_Tricks","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Tipps und Tricks zur API - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tipps und Tricks zur API\" \/>\n<meta property=\"og:description\" content=\"In dieser Zusammenstellung von Tipps und Tricks finden Sie die folgenden Themen: - Tempor&auml;re Dateien  - Der Pfad ins Ungewisse  - CD-Rom auswerfen  - Nervenschoner  - Windows-Version detailliert ermitteln\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-10T20:12:38+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg08.met.vgwort.de\/na\/16912907727e49eabe87f4f93c5b1d8f\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Tipps und Tricks zur API\",\"datePublished\":\"2021-02-10T20:12:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/\"},\"wordCount\":2117,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/16912907727e49eabe87f4f93c5b1d8f\",\"articleSection\":[\"2002\",\"3\\\/2002\",\"Tipps und Tricks\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/\",\"name\":\"Tipps und Tricks zur API - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/16912907727e49eabe87f4f93c5b1d8f\",\"datePublished\":\"2021-02-10T20:12:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/16912907727e49eabe87f4f93c5b1d8f\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/16912907727e49eabe87f4f93c5b1d8f\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tipps_und_Tricks_zur_API\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tipps und Tricks zur API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Tipps und Tricks zur API - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/","og_locale":"de_DE","og_type":"article","og_title":"Tipps und Tricks zur API","og_description":"In dieser Zusammenstellung von Tipps und Tricks finden Sie die folgenden Themen: - Tempor&auml;re Dateien  - Der Pfad ins Ungewisse  - CD-Rom auswerfen  - Nervenschoner  - Windows-Version detailliert ermitteln","og_url":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-10T20:12:38+00:00","og_image":[{"url":"http:\/\/vg08.met.vgwort.de\/na\/16912907727e49eabe87f4f93c5b1d8f","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Tipps und Tricks zur API","datePublished":"2021-02-10T20:12:38+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/"},"wordCount":2117,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/16912907727e49eabe87f4f93c5b1d8f","articleSection":["2002","3\/2002","Tipps und Tricks","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/","url":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/","name":"Tipps und Tricks zur API - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/16912907727e49eabe87f4f93c5b1d8f","datePublished":"2021-02-10T20:12:38+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/16912907727e49eabe87f4f93c5b1d8f","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/16912907727e49eabe87f4f93c5b1d8f"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Tipps_und_Tricks_zur_API\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Tipps und Tricks zur API"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000069","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000069"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000069\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000069"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000069"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000069"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}