Seite 1 von 1

Betriebsystem unabhängig Programmieren mit PB

Verfasst: 22.12.2005 13:16
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 !!

Verfasst: 25.12.2005 16:30
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

Verfasst: 25.12.2005 16:47
von ts-soft
Du kannst grundsätzlich Slashes verwenden, jedes neuere Windows kann
damit umgehen. Umgekehrt, können Linux usw. nicht mit Backslash
umgehen.

Verfasst: 25.12.2005 17:06
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.

Verfasst: 25.12.2005 17:18
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.

Verfasst: 25.12.2005 17:49
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