Verwendetes Linux System erkennen

Für Fragen von Einsteigern und Programmieranfängern...
Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Verwedetes Linux System erkennen

Beitrag von Socke »

Scotty hat geschrieben:Unter MacOS gibt es das Programm sysctl. Mit dem entsprechenden Parameter (z.B. kern.version) wird nur der entsprechende Wert ausgegeben.
Das Programm gibt es auch unter Linux (hier: SuSE Linux Enterprise Server 2010); hier heißt der oben genante Parameter aber "kernel.version".
Im Parameter "kernel.ostype" steht hier der Wert "Linux".

Man kann anstelle des Programms sysctl auch die Dateien unter /proc/sys auslesen (bzw. schreiben). Gilt das auch für MacOS?
Zuletzt geändert von Lori am Do 17. Nov 2011, 20:40, insgesamt 1-mal geändert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Verwedetes Linux System erkennen

Beitrag von Scotty »

Socke hat geschrieben:Gilt das auch für MacOS?
MacOS hat eben kein /proc Verzeichnis. Unter /sbin gibt es sysctl tatsächlich auch für openSuSE.
Ich frage mich allerdings, was man mit dem Wissen anfängt. Bei einem Installer vielleicht automatisch rpm vs. deb auswählen?

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: Verwedetes Linux System erkennen

Beitrag von harrybonn »

Super, die Vorgehensweise, wie unter
http://forum.lazarus.freepascal.org/ind ... l#msg71741" onclick="window.open(this.href);return false;
funktioniert einwandfrei.

Gleichzeitig für mich ein schönes Demo, wie man ein Terminalprogramm unter Lazarus/FPC unsichtbar ausführen kann, das habe ich auch gesucht.

Interessant aber auch die Info von jus, eine XCode-Library zu laden, um so ein Problem zu lösen, was derzeit evtl. nicht bzw. in der gerade verwendeten Lazarus-Version nicht möglich ist.

[ Gibt es dazu auch hier irgendwo ein Beispiel wie man unter xcode eine DLL (oder wie sich das unter OS X so nennt) erzeugen und in Lazarus einbinden kann?]

jus
Beiträge: 52
Registriert: Fr 6. Mai 2011, 13:29

Re: Verwedetes Linux System erkennen

Beitrag von jus »

harrybonn hat geschrieben:...
Interessant aber auch die Info von jus, eine XCode-Library zu laden, um so ein Problem zu lösen, was derzeit evtl. nicht bzw. in der gerade verwendeten Lazarus-Version nicht möglich ist.

[ Gibt es dazu auch hier irgendwo ein Beispiel wie man unter xcode eine DLL (oder wie sich das unter OS X so nennt) erzeugen und in Lazarus einbinden kann?]
Ich stelle die Library getosversion.dylib für Mac OSX zur Verfügung, wenn's wer brauchen kann. Ich habe 2 Versionen von GetMacOSVersion implementiert:

Code: Alles auswählen

GetMacOSVersion: function(): CFStringRef; cdecl;
GetMacOSVersion2: function(var systemVersionMajor:SInt32; var systemVersionMinor: SInt32; var systemVersionBugFix:SInt32): CFStringRef; cdecl;
GetMacOSVersion ... gibt eine sprachabhängige Zeichenkette als CFString zurück.
GetMacOSVersion2 ... gibt zusätzlich auch noch die Versionsinformation wie Major,Minor,Bugfix als Werte zurück.

Beim folgenden Beispiel ist auf einer Form nur ein Button und ein Memo-Feld drauf:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  dynlibs, MacOSAll, CarbonProc;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1;
  H : TLibHandle;
 
  GetMacOSVersion: function(): CFStringRef; cdecl;
  GetMacOSVersion2: function(var systemVersionMajor:SInt32; var systemVersionMinor: SInt32; var systemVersionBugFix:SInt32): CFStringRef; cdecl;
 
implementation
 
{$R *.lfm}
 
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  cfs: CFStringRef;
  s: String;
  systemVersionMajor, systemVersionMinor, systemVersionBugFix: SInt32;
begin
  H := LoadLibrary('/Users/mac/Desktop/getosversion.dylib'); //<------ den richtigen Pfad der Library eintragen
  pointer(GetMacOSVersion) := GetProcedureAddress(H, 'GetMacOSVersion');
  pointer(GetMacOSVersion2) := GetProcedureAddress(H, 'GetMacOSVersion2');
 
  cfs:=GetMacOSVersion();
  s:=CFStringToStr(cfs);
  Memo1.Lines.Add('Mac Version (System): '+s);
 
  cfs:=GetMacOSVersion2(systemVersionMajor, systemVersionMinor, systemVersionBugFix);
  s:=CFStringToStr(cfs);
  Memo1.Lines.Add('Mac Version (System): '+s);
  Memo1.Lines.Add('Major: '+IntToStr(systemVersionMajor));
  Memo1.Lines.Add('Minor: '+IntToStr(systemVersionMinor));
  Memo1.Lines.Add('BugFix: '+IntToStr(systemVersionBugFix));
  FreeLibrary(H);
end;
 
end.
Wie man am obigen Beispiel sieht, sollte man im USES-Teil "dynlibs, MacOSAll, CarbonProc" noch dazugeben. Wenn man das obige Beispiel direkt übernehmen möchte, muß man beim LOADLIBRARY dem Pfad, wo die "getosversion.dylib" auf der eigenen Platte liegt, anpassen.

Lg,
jus
Dateianhänge
getosversion.dylib.zip
(4.55 KiB) 128-mal heruntergeladen

harrybonn
Beiträge: 101
Registriert: Fr 7. Jan 2011, 15:18

Re: Verwedetes Linux System erkennen

Beitrag von harrybonn »

Vielen Dank für die Überlassung der Lib und des Demos.

Unter Lazarus 0.9.3.0 mit fpc 2.4.2 funktioniert das einwandfrei.
Unter Lazarus 0.28.2 mit fpc 2.2.4 klappt der Aufruf von "LoadLibrary" nicht, das zurückgelieferte Handle ist immer 0 (Dateipfad hatte ich angepasst, wird zudem mit fileexist kontrolliert).

Ist es hier evtl. von Bedeutung, mit welcher XCode-Version die dylib erstellt wurde (mit welcher wurde sie erstellt)?

Wie sieht das eigentlich in XCode aus, was muss man da machen, um eine für Lazarus verdauliche dylib zu erzeugen? Dynamic-Library und dann Carbon Dynamic Library?

jus
Beiträge: 52
Registriert: Fr 6. Mai 2011, 13:29

Re: Verwedetes Linux System erkennen

Beitrag von jus »

harrybonn hat geschrieben:Vielen Dank für die Überlassung der Lib und des Demos.

Unter Lazarus 0.9.3.0 mit fpc 2.4.2 funktioniert das einwandfrei.
Unter Lazarus 0.28.2 mit fpc 2.2.4 klappt der Aufruf von "LoadLibrary" nicht, das zurückgelieferte Handle ist immer 0 (Dateipfad hatte ich angepasst, wird zudem mit fileexist kontrolliert).

Ist es hier evtl. von Bedeutung, mit welcher XCode-Version die dylib erstellt wurde (mit welcher wurde sie erstellt)?

Wie sieht das eigentlich in XCode aus, was muss man da machen, um eine für Lazarus verdauliche dylib zu erzeugen? Dynamic-Library und dann Carbon Dynamic Library?
Also ich verwende Lazarus 0.9.31 mit FPC 2.4.2 und Xcode 3.2.4 und es funktioniert. Warum es bei anderen Versionen nicht funktioniert entzieht sich einbiszchen meiner Kenntnis, da ich erst vor paar Monaten mit Lazarus und Mac angefangen habe. Also ich wähle nach einigen Experimenten aktuell in Xcode STL C++ Library. Wie schon gesagt, eher eine Try & Error Geschichte, als dass ich es gut begründen könnte. Vermutlich gibt es noch eine optimalere Lösung.

Lg,
jus

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Verwendetes Linux System erkennen

Beitrag von Heinrich Wolf »

harrybonn hat geschrieben: ...
die Abfrage lsb_release -a erzeugt zwar unter beiden "Distributionen" die gewünsche Datei mit den gewünschten Informationen, aber dazu muss ich doch ein Terminal öffnen, oder?

Ich habe aber eine grafische Anwendung. Oder gibt es die Möglichkeit, von dort aus unbebemerkt ein Terminal zu öffnen, die Datei erzeugen zu lassen, die Informationen einzulesen und das Terminal wieder zu schließen?
...
Shell scripts wie lsb_release kann man unter Linux aus einem Programm heraus starten und deren Ausgabe lesen, indem man popen() verwendet. Ich hab das analog mal mit gconftool-2 zum Ermitteln des Proxy für Indy verwendet.

Code: Alles auswählen

function ReadPipe(Cmd : String; var Output : String) : Boolean;
    var    Pipe : Text;
    begin
      ReadPipe := False;
      Output   := '';
      TTextRec(Pipe).bufend := 0;
      POpen(Pipe, Cmd, 'R');
      if fpgeterrno = 0 then
        begin
          ReadLn(Pipe, Output);
          if PClose(Pipe) = 0 then
            ReadPipe := True;
        end;
    end;
 
ReadPipe('gconftool-2 -g /system/http_proxy/host', Proxy)
Zuletzt geändert von Heinrich Wolf am Do 17. Nov 2011, 13:25, insgesamt 2-mal geändert.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Verwendetes Linux System erkennen

Beitrag von Heinrich Wolf »

Bora4d hat geschrieben: ...

Code: Alles auswählen

if FindFirst('/etc/*-release', faHidden + faSysFile + faArchive + faReadOnly + faSymLink +faAnyFile, aSr) = 0 then begin
...
Diese Zeile mag ja zufällig funktionieren, aber faAnyFile ist ein Bitmuster, das faReadOnly, usw. bereits beinhaltet. Die Bits werden nicht mit + , sondern mit or kombiniert. faAnyFile ($3f) + faReadOnly (1) wirft faReadOnly und mehr Bits aus dem Suchmuster heraus. faAnyFile or faReadOnly würde nicht schaden, aber nur wieder faAnyFile ergeben.

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: Verwedetes Linux System erkennen

Beitrag von theo »

Könnte mal jemand den Titel korrigieren?
-> Verwedeltes Linux System erkennen :mrgreen:

EDIT: Danke

Antworten