Betriebsystem unabhängig Programmieren mit PB

Hier kannst du häufig gestellte Fragen/Antworten und Tutorials lesen und schreiben.
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Betriebsystem unabhängig Programmieren mit PB

Beitrag von PAMKKKKK »

Wenn man Plattform übergreifend Programmieren will, so muss man sich an folgende Programmierregeln halten.

1.
Du schreibst einen Quelltext und den Kompilierst du mit PureBasic auf dem Betriebssystem deiner wahl. Als Beispiel z.B. mit Windows Kompiliert erhältst du eine *.exe die nur unter Windows lauffähig ist!
Nun nimmst du den selben Quelltext und den Kompilierst du auf dem Betriebssystem Linux.
Dadurch erhältst du ein Programm das nur unter Linux lauffähig ist!

Dasselbe machst du dann mit dem selben Quelltext, auf den Betriebsystemen MAC oder AMIGA.
Die dann auch nur unter MAC oder Amiga lauffähig sind.

2.
Wenn du z.B. eine Spezielle Funktion aus der Windows-API im Quelltext nutzen willst (Betriebsystem Spezifische Funktion),
funktioniert das Kompilieren nicht mehr unter den anderen Betriebsystemen !!!!
(Windows-API Befehle gibt es eben nur bei Windows)

Dafür gibt es in PureBasic die Befehle (Compilerdirektiven):
CompilerSelect #PB_Compiler_OS und
CompilerCase #PB_OS_xxxxxxxxx

Hier wird während der Kompilierung abgefragt, mit welchem Betriebsystem (auf dem PureBasic gerade läuft) Kompiliert werden soll.

Wenn du z.B. eine Windows-API Funktion nutzt,
aber auf dem Betriebsystem Linux Kompilierst,
so wird folgende Zeile einfach nicht mit kompiliert:

Code: Alles auswählen

CompilerSelect #PB_Compiler_OS 
  CompilerCase #PB_OS_Windows 
    ; MS Windows Spezielle Befehle: 
    RegisterHotKey_( WindowID(Window), HOTKEY_WIN_W, 8, 87)
    UnregisterHotKey_(WindowID(Window), HotkeyID)
CompilerEndSelect
Wie Falko schrieb, kann man somit einfach, dann abhängig vom System, die passenden Quelltexte (Source-Code) Kompilieren.
Wenn man alle Betriebsystem abhängigen Prozeduren, in einzelnen Quelltexte, für die einzelnen Betriebsysteme zusammenlegt.
z.B Amiga.pbi , Linux.pbi, Mac.pbi, Windows.pbi.

Code: Alles auswählen

CompilerSelect #PB_Compiler_OS 
  CompilerCase #PB_OS_AmigaOS 
    ; AmigaCode 
    IncludeFile  "Amiga.pbi" ; Code der nur unter Amiga Kompiliert wird 
  CompilerCase #PB_OS_Linux 
    ; PinguinCode 
    IncludeFile  "Pinguin.pbi" ; Code der nur unter Linux Kompiliert wird
  CompilerCase #PB_OS_MacOS 
    ; ApfelCode 
    IncludeFile  "Mac.pbi" ; Code der nur unter MAC Kompiliert wird
  CompilerCase #PB_OS_Windows 
    ; FensterCode 
    IncludeFile  "Windows.pbi" ; Code der nur unter Windows Kompiliert wird
CompilerEndSelect
Da eine unter Windows Kompilierte *.exe, niemals unter einem anderen Betriebsystem laufen wird (und umgekehrt), muss man im Quelltext mit den Compilerdirektiven entscheiden, was unter welchem OS ausgeführt werden soll.
Zur Laufzeit geht das daher nicht !!
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Ersma: Danke für das Mini-Tut.
Zweitma: Wünsche frohes Fest gehabt zu haben :)

Wie sieht das denn mit Volumes und Slash/Backslash bei Pfaden aus ?

Für Win schreibt man ja c:\dev\egal\Beispiel

AFAIR nutzen die anderen drei "/" als Trenner.
Paßt PB das automatisch an ?

Und was mach ich mit Volumenamen ?
Ich finde zwar
- GetPathPart
- GetFilePart
- GetExtensionPart
aber kein "GetVolumePart"

Bei AOS wäre "c:\" normalerweise "sys:" oder "myboot:", was bei Linux und MacOS ?
Kann ich beim Coden vermeiden, den ganzen Volume-/Path-Krempel in eine CompilerSelect-Struktur zu packen ?

bis denne...
scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Du kannst grundsätzlich Slashes verwenden, jedes neuere Windows kann
damit umgehen. Umgekehrt, können Linux usw. nicht mit Backslash
umgehen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

ts-soft hat geschrieben:Du kannst grundsätzlich Slashes verwenden, jedes neuere Windows kann damit umgehen. .
Wäre für mich suboptimal.
Zum einen code ich primär auf einem alten W98er (weil mein XP meist mit TV-Aufnahmen und encoden beschäftigt ist), zum anderen will ich mir nicht noch einen Unterscheidungszwang per OSVersion auferlegen.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Warum machste dann Deine TV-Aufnahmen nicht auch OS-Unabhängig :mrgreen:
Geht wahrscheinlich auch nicht so wie Du es Dir wünscht, genauso wirste
beim Programmieren immer Kompromisse eingehen müssen.

Am besten alle fixen Pfade am anfang des Codes per Compilerdirektive
bestimmen und im weiteren Verlauf mit den Variablen arbeiten.

Für dynamische Pfade ist dies ja nicht erforderlich, weil z.B. der
OpenFileRequester es bereits im richtigem Format zurückgibt.

//Edit
>> Bei AOS wäre "c:\" normalerweise "sys:" oder "myboot:", was bei Linux und MacOS ?
Was meinste mit "c:\" ?
Sowas kenne ich als Programmierer überhaupt nicht, könnte das SystemDrive sein, muß aber nicht :mrgreen:

Code: Alles auswählen

Procedure.s GetEnv(szVariable.s)
  Protected Length.l, Buffer.s
  Length = GetEnvironmentVariable_(@szVariable, @Buffer, 0)
  If Length
    Buffer = Space(Length)
    GetEnvironmentVariable_(@szVariable, @Buffer, Length)
    ProcedureReturn Buffer
  EndIf
  ProcedureReturn ""
EndProcedure
Debug GetEnv("SystemDrive")
OS-Unabhängiges Programmieren, setzt natürlich die entsprechenden
Kenntnisse, für die man im allgemeinen mehrere Jahre braucht, in allen
OS-Spezifischen Dingen voraus.
Die Systemlaufwerke der anderen Betriebssysteme sind dann wohl auch entsprechend ihrer API festzustellen, könnte aber auch unveränderliche Werte sein.
Zuletzt geändert von ts-soft am 25.12.2005 17:51, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

ts-soft hat geschrieben:Warum machste dann Deine TV-Aufnahmen nicht auch OS-Unabhängig :mrgreen:
Weil ich das nicht selber coden brauch, da ich mit der gefundenen Lösung bis auf ein paar unwichtige Kleinigkeiten zufrieden bin.
Ätsch. (OT: Suche smily, der feixend die Zunge rausstreckt :))
Geht wahrscheinlich auch nicht so wie Du es Dir wünscht, genauso wirste beim Programmieren immer Kompromisse eingehen müssen.
Das ist mir bewußt, wird mich aber nicht davon abhalten, Kompromisse als letzte Lösung in Erwägung zu ziehen :).
Am besten alle fixen Pfade am anfang des Codes per Compilerdirektive bestimmen und im weiteren Verlauf mit den Variablen arbeiten.
Für dynamische Pfade ist dies ja nicht erforderlich, weil z.B. der OpenFileRequester es bereits im richtigem Format zurückgibt.
Ok, werd ich ersma so machen, ma kucken, wie weit ich komme...
scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Antworten