Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Programm bei Systemstart ausführen wie chkdsk? (https://www.delphipraxis.net/169637-programm-bei-systemstart-ausfuehren-wie-chkdsk.html)

JamesTKirk 6. Aug 2012 11:36

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Bitte sehr, aber beachte bitte, dass es sich noch in der Entwicklung befindet und - wie erwähnt - einige Dinge noch nicht richtig funktionieren. Auch den Kernel Mode (also Treiberentwicklung) habe ich in letzter Zeit sträflich vernachlässigt :oops:

Wenn du den Port mal austesten solltest (er ist bereits in 2.6.0 möglich, aber in 2.7.1 noch ein bisschen mehr verbessert worden), dann bin ich für (konstruktives) Feedback sehr dankbar.

Gruß,
Sven

hathor 6. Aug 2012 15:59

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Mit einem Eintrag in der Registry wird bei WIN 7 auch die Autoexec.bat abgearbeitet.

Code:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon]
"ExcludeProfileDirs"="AppData\\Local;AppData\\LocalLow;$Recycle.Bin;AppData\\Local\\Microsoft\\Outlook"
"BuildNumber"=dword:00001db1
"FirstLogon"=dword:00000000
"ParseAutoexec"="1"
"Shell"="explorer.exe"

himitsu 6. Aug 2012 16:23

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Aber da gibt es noch weniger nutzbare WinAPI (garkeine), womit es bestimmt nicht einfacher wird, dafür Programme zu erstellen.

JamesTKirk 7. Aug 2012 11:21

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von himitsu (Beitrag 1177112)
Aber da gibt es noch weniger nutzbare WinAPI (garkeine), womit es bestimmt nicht einfacher wird, dafür Programme zu erstellen.

Die AutoExec.bat wird von WinLogon oder später ausgeführt (siehe Ort des Registrykeys). Zu diesem Zeitpunkt ist das Win32 Subsystem bereits voll initialisiert (WinLogon ist eine Win32 Anwendung und nutzt die Win32 API entsprechend). Dies ist anders als zum Beispiel chkdsk.exe, welches von SMSS ausgeführt wird. Zu diesem Zeitpunkt sind die Subsysteme noch nicht gestartet und demnach ist auch noch keine WinAPI verfügbar.

Gruß,
Sven

jus 7. Aug 2012 12:01

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von JamesTKirk (Beitrag 1177057)
Zitat:

Zitat von Medium (Beitrag 1177003)
FP wird da auch nicht viel dran drehen können, dass man eine völlig andere Umgebung als gewohnt vor sich hat. Ich denke mal, dass es hier eher darum geht, dass man es überhaupt in einer Pascal-Sprache bewerkstelligen kann. Der Aufwand wird am Ende wohl nahezu der selbe sein. Bei sowas merkt man immer wieder, dass Delphi (bzw. die VCL) ein evtl. doch zu weiches Kissen im Werdegang von manchem ist ;)

Vergiss nicht, dass Free Pascal schon zahlreiche Plattformen erfolgreich abstrahiert hat. Unter anderem DOS, Linux, Windows, Mac OS (Classic!), Amiga und OS/2. Diese unterscheiden sich hinsichtlich ihrer API schon immens und die Native NT API ist hier in recht guter Gesellschaft, auch wenn sie zuerst einmal ungewohnt (und auch noch dazu nur spärlich dokumentiert) ist.

Mein Port bettet sich ganz brav in die Abstraktionsschicht von FPC ein und so kannst du zum Beispiel Dateiein-/ausgabe, FindFirst/-Next/-Close und so weiter ohne Probleme bereits verwenden. Die einzigen (großen) Grundfunktionen, die noch fehlen sind Threading und "Anzapfung" des Exceptionhandlings von NT (welches zum Glück von der Win32 API auch einfach nur durchgereicht wird zur NT API ;) ).

Und um den Entwicklern das Schreiben von Startupanwendungen zu erleichtern, möchte ich auch die Units CRT, Video, Keyboard, Mouse und wenn möglich auch Graphics und Sockets implementieren. Da der Native NT Port allerdings nur eines von vielen meiner Projekte ist, geht das aber nur recht gemächlich voran :roll:

Gruß,
Sven

Hallo Sven
Auch vielen vielen Dank für den Port!! :thumb: Ehrlich gesagt, brenne ich schon darauf das auszuprobieren. :lol: Muß mal reinlesen, wie man den neuesten Freepascal build auf einen Windows installiert. Habe bisher nur Lazarus auf Mac laufen gehabt.
Man liest ja sogar bei MSDN das die Native API nur sehr spärlich dokumentiert ist. Wo im Netz gibt es überhaupt Doku dazu? Gibt es auch Bücher dazu? :gruebel:

Lg,
jus

JamesTKirk 7. Aug 2012 12:26

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von jus (Beitrag 1177194)
Hallo Sven
Auch vielen vielen Dank für den Port!! :thumb: Ehrlich gesagt, brenne ich schon darauf das auszuprobieren. :lol: Muß mal reinlesen, wie man den neuesten Freepascal build auf einen Windows installiert. Habe bisher nur Lazarus auf Mac laufen gehabt.

Eine Warnung noch vorweg: Aktuell wird nur 32-Bit Windows unterstützt. Es sollte zwar relativ leicht sein 64-Bit Windows Unterstützung hinzuzufügen, aber dazu bin ich aktuell noch nicht gekommen.

Hier eine einfache Zusammenfassung der nötigen Schritte (die funktionieren sollten, wenn nicht, gib Bescheid):
  • installier FPC 2.6.0 (wichtig: die 32-Bit Version)
  • lade dir den aktuellen Quellcode von FPC 2.7.1 herunter (SVN oder nightly snapshot von den FTP Servern)
  • geh in das Verzeichnis, in dem sich der Quellcode befindet und führe das folgende Kommando aus, um einen Win32 Compiler zu erzeugen und zu installieren (zum Beispiel nach c:\fpc\2.7.1; ich nenne das Verzeichnis einfach mal %DEIN_INSTALL_DIR%):
    Code:
    make all OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%
  • Kopiere aus dem bin/i386-win32-Verzeichnis deiner 2.6.0 Installation die fpc.cfg in das bin/i386-win32-Verzeichnis deiner 2.7.1 Installation und passe die Pfade in dieser an.
  • Nun kannst du einen NativeNT CrossCompiler erzeugen, in dem du im Quelltextverzeichnis das folgende Kommando ausführst:
    Code:
    make all OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\bin\i386-win32\ppc386.exe
  • Installiert wird der Compiler folgendermaßen:
    Code:
    make crossinstall OS_TARGET=nativent CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR% FPC=%DEIN_INSTALL_DIR%\bin\i386-win32\ppc386.exe
  • Nun kannst du über
    Code:
    %DEIN_INSTALL_DIR%\bin\i386-win32\fpc.exe -Tnativent quellcode.pas
    für Native NT kompilieren.

Zitat:

Zitat von jus (Beitrag 1177194)
Man liest ja sogar bei MSDN das die Native API nur sehr spärlich dokumentiert ist. Wo im Netz gibt es überhaupt Doku dazu? Gibt es auch Bücher dazu? :gruebel:

Ich habe im Endeffekt drei Quellen dafür genutzt:
  • Das Buch Windows NT/2000 Native API Reference
  • Den Quellcode von ReactOS
  • (in der späteren Phase) Direkt "learning by doing", indem ich ein Programm geschrieben habe, mit dem ich im normalen Betrieb von Windows ein Native NT Programm starten kann

Gruß,
Sven

jus 7. Aug 2012 16:04

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Vielen Dank für die detaillierte Anleitung!
Ich habs bisher nicht hingekriegt, dass das läuft. Ich habe mir mit Tortoise SVN den aktuellen FPC trunk geholt.
Was ich rausgefunden habe ist, dass bei folgenden Befehl:
Code:
make all OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%
vermutlich so besser funktioniert:
Code:
make all install OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Doch bei dem nächsten Befehl (bei mir ist %DEIN_INSTALL_DIR%=c:\fpc\trunkbuild):
Code:
make all OS_TARGET=nativent CPU_TARGET=i386 FPC=c:\fpc\trunkbuild\bin\i386-win32\ppc386.exe
bekomme ich zum Schluß folgende Fehlermeldung:
Code:
...
[ 96%] Skipped package x11 which has been disabled for target i386-nativent
[ 97%] Skipped package xforms which has been disabled for target i386-nativent
[ 98%] Skipped package zlib which has been disabled for target i386-nativent
[ 99%] Skipped package zorba which has been disabled for target i386-nativent
make[2]: Leaving directory `C:/FPC/trunk/packages'
make[1]: Leaving directory `C:/FPC/trunk'
make utils_all FPC=C:/FPC/trunk/compiler/ppcross386.exe RELEASE=1
make[1]: Entering directory `C:/FPC/trunk'
make -C utils all
make[2]: Entering directory `C:/FPC/trunk/utils'
C:/FPC/trunk/compiler/ppcross386.exe -Tnativent -XPi386-nativent- -Xr -Ur -Xs -O
2 -n -FuC:/FPC/trunk/rtl/units/i386-nativent -FuC:/FPC/trunk/packages/paszlib -F
uC:/FPC/trunk/packages/fcl-process/units/i386-nativent -FuC:/FPC/trunk/packages/
hash/units/i386-nativent -FuC:/FPC/trunk/packages/fpmkunit -FuC:/FPC/trunk/packa
ges/fcl-base/units/i386-nativent -FE. -FUunits/i386-nativent -di386 -dRELEASE p
pdep.pp
ppdep.pp(18,6) Fatal: Can't find unit Dos used by ppdep
Fatal: Compilation aborted
make[2]: *** [ppdep.exe] Error 1
make[2]: Leaving directory `C:/FPC/trunk/utils'
make[1]: *** [utils_all] Error 2
make[1]: Leaving directory `C:/FPC/trunk'
make: *** [build-stamp.i386-nativent] Error 2

C:\FPC\trunk>_
Ich habe auch vorher die fpc.cfg alle Pfade mit c:\fpc\2.6.0 auf c:\fpc\trunkbuild angepaßt. Ich bin aktuell einbißchen am Ende mit dem Latein. :oops:

Lg,
jus

JamesTKirk 8. Aug 2012 09:55

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von jus (Beitrag 1177243)
Was ich rausgefunden habe ist, dass bei folgenden Befehl:
Code:
make all OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%
vermutlich so besser funktioniert:
Code:
make all install OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%

Oh, stimmt. Sorry. :oops: Das kommt davon wenn man noch zehntausend mal rumeditiert ;)

Zitat:

Zitat von jus (Beitrag 1177243)
Doch bei dem nächsten Befehl (bei mir ist %DEIN_INSTALL_DIR%=c:\fpc\trunkbuild):
Code:
make all OS_TARGET=nativent CPU_TARGET=i386 FPC=c:\fpc\trunkbuild\bin\i386-win32\ppc386.exe
bekomme ich zum Schluß folgende Fehlermeldung:
Code:
...
[ 96%] Skipped package x11 which has been disabled for target i386-nativent
[ 97%] Skipped package xforms which has been disabled for target i386-nativent
[ 98%] Skipped package zlib which has been disabled for target i386-nativent
[ 99%] Skipped package zorba which has been disabled for target i386-nativent
make[2]: Leaving directory `C:/FPC/trunk/packages'
make[1]: Leaving directory `C:/FPC/trunk'
make utils_all FPC=C:/FPC/trunk/compiler/ppcross386.exe RELEASE=1
make[1]: Entering directory `C:/FPC/trunk'
make -C utils all
make[2]: Entering directory `C:/FPC/trunk/utils'
C:/FPC/trunk/compiler/ppcross386.exe -Tnativent -XPi386-nativent- -Xr -Ur -Xs -O
2 -n -FuC:/FPC/trunk/rtl/units/i386-nativent -FuC:/FPC/trunk/packages/paszlib -F
uC:/FPC/trunk/packages/fcl-process/units/i386-nativent -FuC:/FPC/trunk/packages/
hash/units/i386-nativent -FuC:/FPC/trunk/packages/fpmkunit -FuC:/FPC/trunk/packa
ges/fcl-base/units/i386-nativent -FE. -FUunits/i386-nativent -di386 -dRELEASE p
pdep.pp
ppdep.pp(18,6) Fatal: Can't find unit Dos used by ppdep
Fatal: Compilation aborted
make[2]: *** [ppdep.exe] Error 1
make[2]: Leaving directory `C:/FPC/trunk/utils'
make[1]: *** [utils_all] Error 2
make[1]: Leaving directory `C:/FPC/trunk'
make: *** [build-stamp.i386-nativent] Error 2

C:\FPC\trunk>_

Ich hatte das doch behoben!? :shock: Ach ne... des sind ja die Utils... ich muss echt schauen, dass ich diese verdammte Unit Dos implementiere... :evil: hmmm... Probier mal bitte das Folgende innerhalb deines 2.7.1 Source Verzeichnisses:
Code:
cd rtl
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
cd ..\packages
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Falls das "install" im RTL Verzeichnis scheitert, dann führe bitte das Folgende dort aus (notfalls per Explorer ;) ):
Code:
mkdir %DEIN_INSTALL_DIR%\units\i386-nativent
mkdir %DEIN_INSTALL_DIR%\units\i386-nativent\rtl
copy units\i386-nativent\* %DEIN_INSTALL_DIR%\units\i386-nativent
Wie gesagt: Der Native NT Port ist noch experimentell, das trifft auch noch auf die Buildsequenz zu, auch wenn sie bereits um einiges besser ist, als in 2.6.0 ;)

Gruß,
Sven

jus 8. Aug 2012 14:12

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von JamesTKirk (Beitrag 1177304)
Ich hatte das doch behoben!? :shock: Ach ne... des sind ja die Utils... ich muss echt schauen, dass ich diese verdammte Unit Dos implementiere... :evil: hmmm... Probier mal bitte das Folgende innerhalb deines 2.7.1 Source Verzeichnisses:
Code:
cd rtl
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
cd ..\packages
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Falls das "install" im RTL Verzeichnis scheitert, dann führe bitte das Folgende dort aus (notfalls per Explorer ;) ):
Code:
mkdir %DEIN_INSTALL_DIR%\units\i386-nativent
mkdir %DEIN_INSTALL_DIR%\units\i386-nativent\rtl
copy units\i386-nativent\* %DEIN_INSTALL_DIR%\units\i386-nativent
Wie gesagt: Der Native NT Port ist noch experimentell, das trifft auch noch auf die Buildsequenz zu, auch wenn sie bereits um einiges besser ist, als in 2.6.0 ;)

Gruß,
Sven

Funktioniert bei mir die rtl build leider auch nicht. Wenn ich den folgenden Befehl im rtl-Verzeichnis ausführe
Code:
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\bin\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
so kommt folgende Fehlermeldung:
Code:
make[1]: Leaving directory `C:/FPC/source/rtl/nativent'
C:/FPC/2.6.0/bin/i386-Win32/fpcmake.exe -p -Ti386-nativent Makefile.fpc
Processing Makefile.fpc
 Writing Package.fpc
C:/FPC/2.6.0/bin/i386-Win32/ginstall.exe -m 755 -d c:\fpc\build/units/i386-nativ
ent/rtl
C:/FPC/2.6.0/bin/i386-Win32/cp.exe -fp Package.fpc c:\fpc\build/units/i386-nativ
ent/rtl
make -C nativent install
make[1]: Entering directory `C:/FPC/source/rtl/nativent'
C:/FPC/2.6.0/bin/i386-Win32/ginstall.exe -m 755 -d c:\fpc\build/units/i386-nativ
ent/rtl
C:/FPC/2.6.0/bin/i386-Win32/cp.exe -fp ../../rtl/units/i386-nativent/system.ppu
../../rtl/units/i386-nativent/uuchar.ppu ../../rtl/units/i386-nativent/objpas.pp
u ../../rtl/units/i386-nativent/iso7185.ppu ../../rtl/units/i386-nativent/buildr
tl.ppu ../../rtl/units/i386-nativent/ndk.ppu ../../rtl/units/i386-nativent/ndkut
ils.ppu ../../rtl/units/i386-nativent/ddk.ppu ../../rtl/units/i386-nativent/ctyp
es.ppu ../../rtl/units/i386-nativent/strings.ppu ../../rtl/units/i386-nativent/m
atrix.ppu ../../rtl/units/i386-nativent/rtlconsts.ppu ../../rtl/units/i386-nativ
ent/sysconst.ppu ../../rtl/units/i386-nativent/sysutils.ppu ../../rtl/units/i386
-nativent/math.ppu ../../rtl/units/i386-nativent/types.ppu ../../rtl/units/i386-
nativent/strutils.ppu ../../rtl/units/i386-nativent/dateutils.ppu ../../rtl/unit
s/i386-nativent/varutils.ppu ../../rtl/units/i386-nativent/variants.ppu ../../rt
l/units/i386-nativent/typinfo.ppu ../../rtl/units/i386-nativent/fgl.ppu ../../rt
l/units/i386-nativent/classes.ppu ../../rtl/units/i386-nativent/convutils.ppu ..
/../rtl/units/i386-nativent/stdconvs.ppu ../../rtl/units/i386-nativent/x86.ppu .
./../rtl/units/i386-nativent/cpu.ppu ../../rtl/units/i386-nativent/mmx.ppu ../..
/rtl/units/i386-nativent/charset.ppu ../../rtl/units/i386-nativent/ucomplex.ppu
../../rtl/units/i386-nativent/getopts.ppu ../../rtl/units/i386-nativent/fmtbcd.p
pu c:\fpc\build/units/i386-nativent/rtl
cp.exe: ../../rtl/units/i386-nativent/x86.ppu: No such file or directory
make[1]: *** [fpc_install] Error 1
make[1]: Leaving directory `C:/FPC/source/rtl/nativent'
make: *** [nativent_install] Error 2

C:\FPC\source\rtl>
Lg,
jus

JamesTKirk 9. Aug 2012 07:16

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von jus (Beitrag 1177365)
Funktioniert bei mir die rtl build leider auch nicht. Wenn ich den folgenden Befehl im rtl-Verzeichnis ausführe
Code:
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\bin\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
so kommt folgende Fehlermeldung:
Code:
make[1]: Leaving directory `C:/FPC/source/rtl/nativent'
C:/FPC/2.6.0/bin/i386-Win32/fpcmake.exe -p -Ti386-nativent Makefile.fpc
Processing Makefile.fpc
 Writing Package.fpc
C:/FPC/2.6.0/bin/i386-Win32/ginstall.exe -m 755 -d c:\fpc\build/units/i386-nativ
ent/rtl
C:/FPC/2.6.0/bin/i386-Win32/cp.exe -fp Package.fpc c:\fpc\build/units/i386-nativ
ent/rtl
make -C nativent install
make[1]: Entering directory `C:/FPC/source/rtl/nativent'
C:/FPC/2.6.0/bin/i386-Win32/ginstall.exe -m 755 -d c:\fpc\build/units/i386-nativ
ent/rtl
C:/FPC/2.6.0/bin/i386-Win32/cp.exe -fp ../../rtl/units/i386-nativent/system.ppu
../../rtl/units/i386-nativent/uuchar.ppu ../../rtl/units/i386-nativent/objpas.pp
u ../../rtl/units/i386-nativent/iso7185.ppu ../../rtl/units/i386-nativent/buildr
tl.ppu ../../rtl/units/i386-nativent/ndk.ppu ../../rtl/units/i386-nativent/ndkut
ils.ppu ../../rtl/units/i386-nativent/ddk.ppu ../../rtl/units/i386-nativent/ctyp
es.ppu ../../rtl/units/i386-nativent/strings.ppu ../../rtl/units/i386-nativent/m
atrix.ppu ../../rtl/units/i386-nativent/rtlconsts.ppu ../../rtl/units/i386-nativ
ent/sysconst.ppu ../../rtl/units/i386-nativent/sysutils.ppu ../../rtl/units/i386
-nativent/math.ppu ../../rtl/units/i386-nativent/types.ppu ../../rtl/units/i386-
nativent/strutils.ppu ../../rtl/units/i386-nativent/dateutils.ppu ../../rtl/unit
s/i386-nativent/varutils.ppu ../../rtl/units/i386-nativent/variants.ppu ../../rt
l/units/i386-nativent/typinfo.ppu ../../rtl/units/i386-nativent/fgl.ppu ../../rt
l/units/i386-nativent/classes.ppu ../../rtl/units/i386-nativent/convutils.ppu ..
/../rtl/units/i386-nativent/stdconvs.ppu ../../rtl/units/i386-nativent/x86.ppu .
./../rtl/units/i386-nativent/cpu.ppu ../../rtl/units/i386-nativent/mmx.ppu ../..
/rtl/units/i386-nativent/charset.ppu ../../rtl/units/i386-nativent/ucomplex.ppu
../../rtl/units/i386-nativent/getopts.ppu ../../rtl/units/i386-nativent/fmtbcd.p
pu c:\fpc\build/units/i386-nativent/rtl
cp.exe: ../../rtl/units/i386-nativent/x86.ppu: No such file or directory
make[1]: *** [fpc_install] Error 1
make[1]: Leaving directory `C:/FPC/source/rtl/nativent'
make: *** [nativent_install] Error 2

C:\FPC\source\rtl>

Wenn ich nur wüsste, warum er die x86 Unit (Unix only) mitkopieren möchte... Dann lass das "install" weg und kopier die RTL Units manuell wie oben beschrieben... (die "packages" sollten aber funktionieren ;) ).

Gruß,
Sven


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 Uhr.
Seite 2 von 3     12 3      

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