Linux Pendant zu GetModulename(HInstance)

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
USauter
Beiträge: 9
Registriert: Fr 26. Aug 2016, 16:28
OS, Lazarus, FPC: Ubunntu 16.04 (L 1.6+dfsg-1 FPC 3.0.0)
CPU-Target: 64Bit

Linux Pendant zu GetModulename(HInstance)

Beitrag von USauter »

Hallo,

wie kann ich unter Linux kontrollieren, in welchem Kontext (Modul) der Code ausgeführt wird? Unter Windows ist die Kontrolle mittels GetModulename(HInstance) möglich. Für Linux fehlt mir das Pendant.

Besten Dank.

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

Re: Linux Pendant zu GetModulename(HInstance)

Beitrag von theo »

Was ist dein Ziel?
Die Frage ist nicht direkt Lazarus spezifisch, deshalb kann Google vielleicht helfen.
Z.B:
https://groups.google.com/forum/#!topic ... OaSzkQr52A

Siehe dort auch:
In my experience, MSWindows programmers who look for a function to obtain the full path of an executing process's executable are trying to solve the wrong problem...


Für Konfigurationsdateien: http://lazarus-ccr.sourceforge.net/docs ... igdir.html

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Linux Pendant zu GetModulename(HInstance)

Beitrag von marcov »

(die oberere Diskussion geht ganz vorbei um heraus zu finden in welchen Präfix man installiert ist. So das man zb /usr/local/etc finden kann )

Socke
Lazarusforum e. V.
Beiträge: 3158
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: Linux Pendant zu GetModulename(HInstance)

Beitrag von Socke »

marcov hat geschrieben:(die oberere Diskussion geht ganz vorbei um heraus zu finden in welchen Präfix man installiert ist. So das man zb /usr/local/etc finden kann )

Unter Linux ist es (soweit ich das korrekt interpretiere) üblich, den Installationspfad beim Kompilieren fest vorzugeben.
Davon abgeleitet ist dann auch der globale Konfigurationspfad (/etc, /usr/local/etc).

Unter Free Pascal gibt es hierzu keine vordefinierte Möglichkeit; man könnte z.B. ein Compile-Time-Macro hierzu verwenden.
Das Programm sollte dann zur Laufzeit, die Variable SysUtils.SysConfigDir entsprechend dem globalen Konfigurationsverzeichnis setzen (per Standard /etc).
Damit greift dann auch die Funktion GetAppConfigDir auf das korrkte Verzeichnis zu.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Linux Pendant zu GetModulename(HInstance)

Beitrag von marcov »

Socke hat geschrieben:
marcov hat geschrieben:(die oberere Diskussion geht ganz vorbei um heraus zu finden in welchen Präfix man installiert ist. So das man zb /usr/local/etc finden kann )

Unter Linux ist es (soweit ich das korrekt interpretiere) üblich, den Installationspfad beim Kompilieren fest vorzugeben.


Ich weiß was die Theorie ist. Das ist gerade das Problem, und ladet nicht wirklich ein etwas dynamisch damit um zu gehen. Und nicht alle Software ist auf jedes System neukompiliert.

Aber Linux natürlich hat nie ein Problem. Wenn es nicht funktioniert oder etwas nicht gibst ist da immer jemand der dich erklären will warum du das auch nicht wirklich brauchst, und das Linux "anders" ist. :-)

USauter
Beiträge: 9
Registriert: Fr 26. Aug 2016, 16:28
OS, Lazarus, FPC: Ubunntu 16.04 (L 1.6+dfsg-1 FPC 3.0.0)
CPU-Target: 64Bit

Re: Linux Pendant zu GetModulename(HInstance)

Beitrag von USauter »

theo hat geschrieben:Was ist dein Ziel?

  • Um z.B. bei einer Fehlerausgabe zu melden, wie das Modul heißt, in dem der Fehler auftrat.
  • Um mich selbst zu kontrollieren, in welchem Modul Speicher reserviert wurde und daher dort auch freigegeben werden muss.

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: Linux Pendant zu GetModulename(HInstance)

Beitrag von aro »

Hallo,

unter Linux verwende ich auf dem Raspberry :

Code: Alles auswählen

procedure SetProPfad;
Var PC : PChar;
    ss  : Array [0..255] of Char;
begin
  SS := Paramstr(0);   //Application.ExeName;
  PC := StrRScan(ss, '/');
  if PC <> Nil then begin
    PC[1] := #0;
  end;
  ProPfad := StrNew(ss);


Du erhältst den vollständigen Pfad mit Programmname.

In dem Fall interessiert mich der Programmpfad, um in Unterpfaden andere Dateien zu öffnen oder abzulegen.
PC +1 enthält den Namen der Anwendung.

MfG

Aro
Zuletzt geändert von Lori am Mi 16. Nov 2016, 18:41, insgesamt 1-mal geändert.
Grund: Highlighter

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Linux Pendant zu GetModulename(HInstance)

Beitrag von Mathias »

@aro

Wieso so kompliziert ?

Code: Alles auswählen

var
  s: string;
begin
  s := ParamStr(0);
  ShowMessage(ExtractFileDir(s) + LineEnding + LineEnding + ExtractFileName(s))


http://www.freepascal.org/docs-html/rtl ... tines.html
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: Linux Pendant zu GetModulename(HInstance)

Beitrag von aro »

Hallo,

ich programmiere sehr große und sehr komplexe Projekte und da kommt es sehr auf schnelle Ausführungszeiten an. Kurze Quelltexte mit kompakten Funktionen sind schnell geschrieben aber brauchen oft sehr viel Zeit bei der Ausführung selbst.

Deshalb verwende ich auch grundsätzlich nullterminierte Zeichenketten und keine Strings.

Bei Lazarus ist das besonders schlimm, weil der Quelltext für mehrere Betriebssysteme ausführbar sein muß. Eine Funktion ist da sicher nur eine vernachlässigbare Zeitverschwendung, aber diese Sünden addieren sich gewaltig.

Es ist leider mode geworden, einfachen Programmierstiel mit schnellerer Rechentechnik zu kompensieren.

Es soll jeder selbst entscheiden, ob es für ihn besser ist das Programm schnell zu schreiben oder schnell auszuführen.

MfG

Aro

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Linux Pendant zu GetModulename(HInstance)

Beitrag von Mathias »

ich programmiere sehr große und sehr komplexe Projekte und da kommt es sehr auf schnelle Ausführungszeiten an. Kurze Quelltexte mit kompakten Funktionen sind schnell geschrieben aber brauchen oft sehr viel Zeit bei der Ausführung selbst.

Dies kommt immer auf die Situation an, wen man etwas zeitkritisches in einer Schleife hat, da lohnt es sich jedes Byte zu optimieren, aber Sachen, die nur gelegentlich aufgerufen werden, da bringt es nicht viel. Sonst könnte man das ganze Programm in Assembler schreiben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Linux Pendant zu GetModulename(HInstance)

Beitrag von marcov »

aro hat geschrieben:Deshalb verwende ich auch grundsätzlich nullterminierte Zeichenketten und keine Strings.


Null terminierte Strings sinds langsamer als Längepräfixed Strings. (logisch, weil zehn * eine Integer Länge up to date halten (~O(1) billiger ist als nur ein Mahl strlen()) (~O(n))

Also nie Null terminated Strings wenn mann Performance braucht. Das ist nur altmodisch C, und dient kein realistischer Zweck

Schlimmsten Fall verzichten auf Automation und rein manuell verarbeitete Längepräfixed Strings nutzen.

Aber Nullterminated Strings verarbeiten aus Performanceblickpunkt ist quatsch

Siehe auch zb mein post auf SO

Socke
Lazarusforum e. V.
Beiträge: 3158
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: Linux Pendant zu GetModulename(HInstance)

Beitrag von Socke »

marcov hat geschrieben:Aber Nullterminated Strings verarbeiten aus Performanceblickpunkt ist quatsch

Die impliziten try..finally-Blöcke bei Verwendung von managed Data Types (String, referenzgezählte Interfaces, dynamische Arrays) nicht einen wesentlich höheren Anteil an der Laufzeit?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Linux Pendant zu GetModulename(HInstance)

Beitrag von marcov »

Socke hat geschrieben:
marcov hat geschrieben:Aber Nullterminated Strings verarbeiten aus Performanceblickpunkt ist quatsch

Die impliziten try..finally-Blöcke bei Verwendung von managed Data Types (String, referenzgezählte Interfaces, dynamische Arrays) nicht einen wesentlich höheren Anteil an der Laufzeit?


Gegen manueller Null-terminated (NT) Strings, ohne Optimierung (siehe unter) sicher.

Gegen automatisch Managed NT oder generierter NT Kode: nicht immer. Wenn strlen() zu viel wird angerufen ... Speziell im neueren Code mit im Durchschnitt kürzeren Prozeduren (lese in nicht antike Stilen wie zb OO), wird die Länge häufiger neu geladen und ist NT eben schlimmer. (mehr O(n) Operationen).

Auch kann man mit {$Implicitexceptions} die schlimmste Engpässen optimieren und oft noch sehr nah dran kommen mit erheblich weniger Mühe, oder mit pointer arbeiten.

Aber das war nicht der Kern meiner Bemerkung, sonst dies: wenn es schlimm genug ist das man überwiegt manueller Stringkode zu schreiben , soll man auch keine Kompromisen schliessen und für die mehr Performancestarken Technologie (also Längepräfixed, LP) wählen.

Es gibt nur NT primitieve in FPC für C Interfacing, die sind nicht für neuen Kode.

Den alte Ruf das NT schneller ist, ist teilweise mit nicht Optimierende Kompiler (und die falsche Annahme das LP Runtimes nicht auch pointers nutzen), teilweise ein Artefakt von die originelle Unix Architektur, PDP 9 und 11, die pre und postincrement additionel in manche Instruktionen kodieren konnten. Also da war ++ und -- im Kombination mit * (oder p^ in Pascal) billiger.

Heute wurden in solchen Fall aber Optimierende Kompiler solche Kode in viel mehr Falle automatisch erzeugen können.

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: Linux Pendant zu GetModulename(HInstance)

Beitrag von aro »

Man kann von Strings halten was man will. Letztendlich muß jeder mit seinem Programmierstiel glücklich werden. Fakt ist, das Windows überhaupt keine Strings kennt und jegliche Textübergaben an eine Windows -Api als nullterminierte Zeichenkette erfolgen muß ! Und selbst wenn die Programiersprache für solche Funktionen Strings vorsieht, dann muß der Kompiler im Hintergrund erst den String eine nullterminierte Zeichenkette umwandeln! Und wenn man Texte abfragt, dann liefert das Betriebssystem die ebenfalls nur eine nullterminierte Zeichenkette und die Programmiersprache wandelt diese im Hintergrund erst in einen String um. Bei Linux sieht es nicht anders aus. Das umwandeln kostet mehr Zeit, als wenn man das Format benutzt, was letztendlich übergeben wird. Bei dynamisch angelegten Strings wird bei jeder Aktion die neue Länge errechnet und angepasst. Wenn ein paar Zeichen angehängt werden und der Platz des reservierten Speichers an der Positon nicht erweitert werden kann, dann muß neuer Speicher reserviert werden, der String wird dann in den neuen Bereich kopiert und der alte Bereich freigegeben. Was soll daran schneller gehen als einen fest reservierten Speicher zu benutzen ????

Antworten