Darstellung einer Hilfe-Datei im *.CHM-Format

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
KHKDampflok
UDF-Programmierer
UDF-Programmierer
Beiträge: 68
Registriert: Do, 14. Dez 2006 20:55
Wohnort: 22946 Trittau
Kontaktdaten:

Darstellung einer Hilfe-Datei im *.CHM-Format

Beitrag von KHKDampflok »

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
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 !!!
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
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:

Re: Darstellung einer Hilfe-Datei im *.CHM-Format

Beitrag von Herbert »

Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
HaPe
1000 working lines a day
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

Beitrag von HaPe »

Hallo Karl-Heinz !
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
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 :D
--
Hans-Peter
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

KHKDampflok hat geschrieben:Eine RTF-Datei als Quellcode steht zur Vefügung.
drucke es doch einfach als PDF-Handbuch
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.
es gibt doch die Function OS()

Code: Alles auswählen

#include "os.ch"
PROC MAIN
? OnOSVersion()
WAIT
RETURN

FUNCTION OnOSVersion()
RETURN VAL( OS(OS_VERSION) )
nun zeigt die v1.9.355 bei Windows 10 nur "6.02" an wenn man kein (erweitertest) Manifest benutzt.

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
Antworten