Hallo Leute,
heute melde ich mich mal wieder nach langer Zeit mit einem neuen Problem. Meine Triebfahrzeugsdatenbank LOKLISTE läuft seit langer Zeit ohne nennenswerte Probleme. Durch Microsoft habe ich jetzt aber ein neues Problem bekommen, da unter Windows 10 meine Bedienungsanleitung im *.hlp Format nicht mehr angezeigt wird. Eine Suche nach einer Lösung im Forum hat auf den ersten Blick nichts gebracht. Vielleicht kann mir jemand kurz die mögliche Vorgehensweise skizzieren. Eine RTF-Datei als Quellcode steht zur Vefügung.
In dem Zusammenhang taucht aber noch eine andere Frage auf. Wie kann ich mit XBase++ 1.9 das verwendete Betriebssystem auslesen ? ich habe einen interressanten Beitrag darüber im Forum gelesen, vermag den aber nicht so ohne weiteres umzusetzen.
Der Beitrag ist von HaPe vom 02.12.2015 11:15 am mit dem Titel "Betriebssystem ermitteln (1.90.355)" und umfasst folgenden Text :
In meinen Programmen (mit VFP) bestimme ich die Betriebssystem-Version durch auslesen aus der Registry und lese aus:
- CurrentVersion
- CurrentBuild
- ProductName
Schlüssel
#DEFINE KEY_NTCURRENTVERSION "Software\Microsoft\Windows NT\CurrentVersion"
Damit erhalte ich zb. unter 8.1 64-Bit:
Windows-Version: 6.3 (Build 9600)
Windows-Name: Windows 8.1 Enterprise - 64 Bit
Unter 10.0 - 64 Bit:
Windows-Version: 6.3 (Build 10240)
Windows-Name: Windows 10 Enterprise N 2015 LTSB - 64 Bit
Meine Frage ist jetzt, wie ich diese Information erhalten kann ?
Natürlich bin ich auch für andere Vorgehensweisen dankbar !!!
Gruß Dipl. Ing. Karl-Heinz Kahl
Darstellung einer Hilfe-Datei im *.CHM-Format
Moderator: Moderatoren
-
- UDF-Programmierer
- Beiträge: 68
- Registriert: Do, 14. Dez 2006 20:55
- Wohnort: 22946 Trittau
- Kontaktdaten:
Darstellung einer Hilfe-Datei im *.CHM-Format
Mit xbase habe ich ein Triebfahrzeugsarchiv "LOKLISTE" erstellt. Dieses Archiv enthält Daten aller Eisenbahntriebfahrzeuge vom "ADLER" bis zum ICE. Genaueres erfährt man unter www.lokliste.de, wo man auch eine kostenlose DEMO-Version herrunterladen kann !!!
- Herbert
- Der Entwickler von "Deep Thought"
- Beiträge: 1991
- Registriert: Do, 14. Aug 2008 0:22
- Wohnort: Gmunden am Traunsee, Österreich
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
- HaPe
- 1000 working lines a day
- Beiträge: 996
- Registriert: So, 15. Nov 2015 17:44
- Wohnort: 71665 Vaihingen-Enz
- Hat sich bedankt: 17 Mal
- Danksagung erhalten: 15 Mal
Re: Darstellung einer Hilfe-Datei im *.CHM-Format
Hallo Karl-Heinz !
Die benötigten Windows-API-Funktionen werden unter VFP folgendermaßen "bekannt" gemacht:
DECLARE INTEGER RegCloseKey IN WIN32API INTEGER hKey
DECLARE INTEGER RegOpenKeyEx IN WIN32API INTEGER hKey, STRING @lpSubKey, INTEGER ulOptions, INTEGER samDesired, INTEGER @phkResult
DECLARE INTEGER RegQueryValueEx IN WIN32API INTEGER hKey, STRING lpValueName, INTEGER lpReserved, INTEGER @lpType, STRING @lpData, INTEGER @lpcbData
Folgende DEFINES werden noch benötigt:
#DEFINE KEY_NTCURRENTVERSION "Software\Microsoft\Windows NT\CurrentVersion"
#DEFINE KEY_WIN4CURRENTVERSION "Software\Microsoft\Windows\CurrentVersion"
#DEFINE HKEY_LOCAL_MACHINE -2147483646 && BITSET(0,31)+2
#DEFINE KEY_QUERY_VALUE 1
#DEFINE ERROR_SUCCESS 0 && OK
#DEFINE CR CHR( 13 )
Bei Fragen einfach fragen
Der Beitrag ist von HaPe vom 02.12.2015 11:15 am mit dem Titel "Betriebssystem ermitteln (1.90.355)" und umfasst folgenden Text :
In meinen Programmen (mit VFP) bestimme ich die Betriebssystem-Version durch auslesen aus der Registry und lese aus:
- CurrentVersion
- CurrentBuild
- ProductName
Schlüssel
#DEFINE KEY_NTCURRENTVERSION "Software\Microsoft\Windows NT\CurrentVersion"
Code: Alles auswählen
*----------------------------------------------------------------------------------------------------------------------------
* Beschreibung: Gibt die Versionsnummer des Betriebssystemes zurück.
* Autor.......: Hans-Peter Grözinger
* Datum.......: 28.12.2007
*----------------------------------------------------------------------------------------------------------------------------
* Bemerkungen.: Quelle: http://fox.wikis.com/wc.dll?Wiki~VFPFunctionOS~VFP
* http://fox.wikis.com/wc.dll?Wiki~CurrentVersion~SoftwareEng
* OS() OS(3)+OS(4) Bemerkung Betriebssystem
* Windows 4.00 4.00 Windows 95
* Windows 4.10 4.10 Windows 98
* Windows 4.10 4.10 OS(5) bringt ?? Windows 98 SE
* Windows 4.90 4.90 Windows ME
* Windows NT 4.00 4.00 Windows NT 4.00
* Windows NT 5.00 / 5.00 5.00 Windows 2000
* Windows 5.01 5.01 Windows XP
* Windows 5.02 5.02 Windows Server 2003
* Windows 6.00 6.00 OS(5) bringt '6000' Windows Vista
* Windows 6.00 6.00 OS(5) bringt '6001' Windows Server 2008 RC0
* Windows 7.00 6.01 OS(5) bringt '7601' Windows 7 SP1
* Windows 7.00 6.01 OS(5) bringt '??01' Windows Server 2008 R2
* Windows 8.00 6.02 OS(5) bringt '??01' Windows 8.00
* Windows 8.00 6.02 OS(5) bringt '??01' Windows Server 2012
* Windows 8.10 Preview 6.02 OS(5) bringt '9200' Windows 8.10 Preview
* Windows 8.10 6.02 falsch OS(5) bringt '9200' falsch Windows 8.10
* Windows 10.00 6.02 falsch OS(5) bringt '9200' falsch Windows 10.00
*----------------------------------------------------------------------------------------------------------------------------
* Änderungen..:
* 30.03.16 HPG: Durch den Eintrag von <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> in die Manifest-
* Datei liefert die Zeile "VAL( OS( 3 ) + ',' + OS( 4 ) )" schon die korrekte Windows-Versions-Nummer in der
* EXE.
*----------------------------------------------------------------------------------------------------------------------------
* BugFixes....:
*----------------------------------------------------------------------------------------------------------------------------
#INCLUDE ..\INCLUDES\REGISTRY.H
LPARAMETERS tlGetVersionString AS STRING
LOCAL lcOSVersionString AS STRING, lcKey AS STRING, lcPoint AS STRING, lcVersionInfo AS STRING, lcServicePack AS STRING
LOCAL lnVFPOSVersionNumber AS INTEGER, lnError AS INTEGER, lnReserved AS INTEGER, lnResult AS INTEGER, lnType AS INTEGER
LOCAL lnOSVersionNumber AS INTEGER, lnServicePack AS INTEGER
LOCAL luReturn AS VARIANT
*-- Gibt die Versionsnummer des Betriebssystemes zurück
lnVFPOSVersionNumber = VAL( OS( 3 ) + ',' + OS( 4 ) )
*-- Wir haben W2K, WXP, Vista, Windows 7, Windows 8/8.1 oder Windows 10
IF lnVFPOSVersionNumber >= 3.51 .AND. lnVFPOSVersionNumber <= 10.00
*-- Parameter vorbesetzen
lnReserved = 0
lnResult = 0
lcOSVersionString = ''
lnOSVersionNumber = 0.0
*-- Schlüssel für Versions-Key bestimmen und dann diesen Schlüssel öffnen
lcKey = IIF( '4' $ UPPER( OS() ), KEY_WIN4CURRENTVERSION, KEY_NTCURRENTVERSION )
lnError = RegOpenKeyEx( HKEY_LOCAL_MACHINE, lcKey, lnReserved, KEY_QUERY_VALUE, @lnResult )
*-- Auch dies hat funktioniert
IF lnError = ERROR_SUCCESS
*-- Parameter vorbesetzen
lnType = 0
lcBuffer = SPACE( 128 )
lnBufferSize = LEN( lcBuffer )
*-- Gibt es dort den Schlüssel 'CurrentVersion'
lnError = RegQueryValueEx( lnResult, 'CurrentVersion', lnReserved, @lnType, @lcBuffer, @lnBufferSize )
*-- Ja, dann diesen Schlüssel auslesen anzeigen
IF lnError = ERROR_SUCCESS .AND. lcBuffer <> CHR( 0 )
lcOSVersionString = lcOSVersionString + LEFT( lcBuffer, lnBufferSize - 1 ) + CR
*-- Alte Point-Einstellung merken und auf Dezimalpunkt setzen
lcPoint = SET( 'Point' )
SET POINT TO '.'
lnOSVersionNumber = VAL( lcOSVersionString )
*-- Alte Point-Einstellung wieder einstellen
SET POINT TO lcPoint
ENDIF
*-- Parameter vorbesetzen
lnType = 0
lcBuffer = SPACE( 128 )
lnBufferSize = LEN( lcBuffer )
*-- Gibt es dort den Schlüssel 'CurrentBuild'
lnError = RegQueryValueEx( lnResult, 'CurrentBuild', lnReserved, @lnType, @lcBuffer, @lnBufferSize )
*-- Ja, dann diesen Schlüssel auslesen anzeigen
IF lnError = ERROR_SUCCESS .AND. lcBuffer <> CHR( 0 )
lcOSVersionString = lcOSVersionString + LEFT( lcBuffer, lnBufferSize - 1 ) + CR
ENDIF
*-- Parameter vorbesetzen
lnType = 0
lcBuffer = SPACE( 128 )
lnBufferSize = LEN( lcBuffer )
*-- Gibt es dort den Schlüssel 'ProductName'
lnError = RegQueryValueEx( lnResult, 'ProductName', lnReserved, @lnType, @lcBuffer, @lnBufferSize )
*-- Ja, dann diesen Schlüssel auslesen anzeigen
IF lnError = ERROR_SUCCESS .AND. lcBuffer <> CHR( 0 )
lcOSVersionString = lcOSVersionString + LEFT( lcBuffer, lnBufferSize - 1 ) + CR
ENDIF
ENDIF
*-- Registry-Schlüssel wieder zumachen
RegCloseKey( lnResult )
*-- Prüfen ob Service-Pack installiert. Wenn Ja
*-- die Version bestimmen
lcVersionInfo = CHR( 156 ) + REPLICATE( NUL, 300 )
GetVersionEx( @lcVersionInfo )
lnServicePack = THIS.ConvertcBuffer2Int( SUBSTR( lcVersionInfo, 149, 2 ) )
IF lnServicePack > 0.0
lcServicePack = 'Service Pack ' + TRANSFORM( lnServicePack, '@ 9' )
lcOSVersionString = lcOSVersionString + lcServicePack
ELSE
lcOSVersionString = lcOSVersionString + ''
ENDIF
ENDIF
*-- Rückgabe setzen
IF tlGetVersionString
luReturn = lcOSVersionString
ELSE
luReturn = lnOSVersionNumber
ENDIF
RETURN( luReturn )
*----------------------------------------------------------------------------------------------------------------------------
* Beschreibung: Funktion zum Umwandeln eines binär codierten Zahlenwertes aus einem String-Puffer in einen Integer-Wert.
* Autor.......: Hans-Peter Grözinger
* Datum.......: 06.03.2004
*----------------------------------------------------------------------------------------------------------------------------
* Bemerkungen.:
*----------------------------------------------------------------------------------------------------------------------------
* Änderungen..:
* 05.10.05 HPG: Neuer Modus für DOUBLE-Werte hinzugefügt.
* 23.05.11 HPG: Neuer Modus für 2-Byte-Werte hinzugefügt.
*----------------------------------------------------------------------------------------------------------------------------
* BugFixes....:
*----------------------------------------------------------------------------------------------------------------------------
PROCEDURE ConvertcBuffer2Int
***************************************
LPARAMETERS tcBuffer AS STRING
LOCAL lnInteger AS INTEGER, lnLength AS INTEGER
*-- Pufferlänge bestimmen
lnLength = LEN( tcBuffer )
lnInteger = 0
*-- Je nach Länge des Puffers verzweigen
DO CASE
*-- Wenn der Puffer 2 Bytes lang ist
CASE lnLength = 2
*-- Integerwert aus String-Puffer bestimmen
lnInteger = ASC( SUBSTR( tcBuffer, 1, 1 ) ) + ;
BITLSHIFT( ASC( SUBSTR( tcBuffer, 2, 1 ) ), 8 )
*-- Wenn der Puffer 4 Bytes lang ist
CASE lnLength = 4
*-- Integerwert aus String-Puffer bestimmen
lnInteger = ASC( SUBSTR( tcBuffer, 1, 1 ) ) + ;
BITLSHIFT( ASC( SUBSTR( tcBuffer, 2, 1 ) ), 8 ) + ;
BITLSHIFT( ASC( SUBSTR( tcBuffer, 3, 1 ) ), 16 ) + ;
BITLSHIFT( ASC( SUBSTR( tcBuffer, 4, 1 ) ), 24 )
*-- Wenn der Puffer 8 Bytes lang ist
CASE lnLength = 8
*-- Integerwert aus String-Puffer bestimmen
lnInteger = ( ( ( ( ( ( ( ASC( SUBSTR( tcBuffer, 8, 1 ) ) ) * 256 + ;
ASC( SUBSTR( tcBuffer, 7, 1 ) ) ) * 256 + ;
ASC( SUBSTR( tcBuffer, 6, 1 ) ) ) * 256 + ;
ASC( SUBSTR( tcBuffer, 5, 1 ) ) ) * 256 + ;
ASC( SUBSTR( tcBuffer, 4, 1 ) ) ) * 256 + ;
ASC( SUBSTR( tcBuffer, 3, 1 ) ) ) * 256 + ;
ASC( SUBSTR( tcBuffer, 2, 1 ) ) ) * 256 + ;
ASC( SUBSTR( tcBuffer, 1, 1 ) )
*-- Andernfalls ...
OTHERWISE
*-- ... gibts eine Fehlermeldung
MESSAGEBOX( 'Ungültiger Puffer an ConvertcBuffer2Int in goApp übergeben!' + CR + 'Es wird der Wert 0 zurückgegeben' )
ENDCASE
RETURN( lnInteger )
ENDPROC
DECLARE INTEGER RegCloseKey IN WIN32API INTEGER hKey
DECLARE INTEGER RegOpenKeyEx IN WIN32API INTEGER hKey, STRING @lpSubKey, INTEGER ulOptions, INTEGER samDesired, INTEGER @phkResult
DECLARE INTEGER RegQueryValueEx IN WIN32API INTEGER hKey, STRING lpValueName, INTEGER lpReserved, INTEGER @lpType, STRING @lpData, INTEGER @lpcbData
Folgende DEFINES werden noch benötigt:
#DEFINE KEY_NTCURRENTVERSION "Software\Microsoft\Windows NT\CurrentVersion"
#DEFINE KEY_WIN4CURRENTVERSION "Software\Microsoft\Windows\CurrentVersion"
#DEFINE HKEY_LOCAL_MACHINE -2147483646 && BITSET(0,31)+2
#DEFINE KEY_QUERY_VALUE 1
#DEFINE ERROR_SUCCESS 0 && OK
#DEFINE CR CHR( 13 )
Bei Fragen einfach fragen
--
Hans-Peter
Hans-Peter
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Darstellung einer Hilfe-Datei im *.CHM-Format
drucke es doch einfach als PDF-HandbuchKHKDampflok hat geschrieben:Eine RTF-Datei als Quellcode steht zur Vefügung.
es gibt doch die Function OS()KHKDampflok hat geschrieben:In dem Zusammenhang taucht aber noch eine andere Frage auf. Wie kann ich mit XBase++ 1.9 das verwendete Betriebssystem auslesen ? ich habe einen interressanten Beitrag darüber im Forum gelesen, vermag den aber nicht so ohne weiteres umzusetzen.
Code: Alles auswählen
#include "os.ch"
PROC MAIN
? OnOSVersion()
WAIT
RETURN
FUNCTION OnOSVersion()
RETURN VAL( OS(OS_VERSION) )
im selben Thread wurde das Problem angesprochen das man im Manifest "supportedOS" verwenden sollte um seine Xbase++ als OS "kompatibel" zu kennzeichnen.
mehr unter https://msdn.microsoft.com/en-us/librar ... s.85).aspx
gruss by OHR
Jimmy
Jimmy