Wie funktioniert h2pas

Für Fragen von Einsteigern und Programmieranfängern...
wennerer
Beiträge: 642
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Wie funktioniert h2pas

Beitrag von wennerer »

Hallo zusammen,
ich möchte mich etwas mit dem Thema C-Header bzw. Pascal Bindings beschäftigen. Zum Einstieg habe ich folgendes gefunden:

https://github.com/williamhunter/pascal ... (v1.0).pdf

Wie dort beschrieben habe ich zuerst die C-Datei "summe.c" in einem Texteditor erstellt (bin unter Linux Mint). In der ist die eigentliche Funktion "sum".

Code: Alles auswählen

/*
* Dateiname: summe.c
*
*/
#include "summe.h"
int sum(int x, int y)
{
return x+ y;
}
Dann habe ich die Header "summe.h" ebenfalls in einem Texteditor erstellt.

Code: Alles auswählen

/*
* Dateiname: summe.h
*
*/
#ifndef SUMME_H
#define SUMME_H
// Funktionsprototyp(en)
int sum(int x, int y);
#endif
Hier kommt schon meine erste Frage:
Was genau macht hier:
#ifndef SUMME_H
#define SUMME_H

Aus den beiden Dateien habe ich mit dem Befehl
gcc -c summe.c
im Terminal die Objectdatei summe.o erzeugt.

Dann habe ich per Hand ein Programm und eine Unit (Binding) erzeugt mit der ich die Funktion aufrufen kann.

Code: Alles auswählen

program project1;
{$mode objfpc}{$H+}
uses Unit1;

var a, b: integer;

begin
 a := 12; // 17 im C-Programm
 b := 51; // 19 im C-Programm
 writeln('Aus Pascal: Die Summe von ', a, ' und ', b, ' ist ', sum(a, b));
end.

Code: Alles auswählen

unit Unit1;

{$link summe.o} // Link zum C-Objekt-Code
interface

uses
  ctypes; // muss angegeben werden, sonst wird FPC nicht kompiliert;

function sum(x, y : cint32) : cint32; cdecl; external;
// Funktions-Args und -Typen müssen mit denen in sum.h übereinstimmen

implementation

end.
Das funktioniert wie in dem Link beschrieben ohne Probleme. Im nächsten Schritt habe ich versucht die Bindingsunit mit h2pas zu generieren.
Ich habe die Datein summe.h und summe.o in ein leeres Verzeichnis kopiert. Dann habe ich mit Lazarus ein neues einfaches Programm erstellt in dem ich die Funktion sum aufrufe:

Code: Alles auswählen

program project1;
{$mode objfpc}{$H+}
uses summe;

var a, b: integer;

begin
 a := 10; 
 b := 12; 
 writeln('Aus Pascal: Die Summe von ', a, ' und ', b, ' ist ', sum(a, b));
end.
Diese Datei habe ich in den Ordner zu den Datein summe.h und summe.o gespeichert. Anschließend habe ich h2pas geöffnet und mit add h.files die Datei summe.h hinzugefügt.
Hier sind die Einstellungen die ich gewählt habe:
h2pasEinstellungen.png
h2pasEinstellungen.png (67.94 KiB) 492 mal betrachtet
Und so sieht das Ergebnis aus nach dem ich run h2pas geklickt habe:

Code: Alles auswählen

unit summe;
interface

uses
  ctypes;

{
  Automatically converted by H2Pas 1.0.0 from /home/bernd/Sprachen/Lazarus/64_bit/H2Pas/Test4/summe.tmp.h
  The following command line parameters were used:
    -e
    -c
    -S
    -d
    -C
    -o
    /home/bernd/Sprachen/Lazarus/64_bit/H2Pas/Test4/summe.pas
    /home/bernd/Sprachen/Lazarus/64_bit/H2Pas/Test4/summe.tmp.h
}

{$IFDEF FPC}
{$PACKRECORDS C}
{$ENDIF}



{$ifndef SUMME_H}

function sum(x:cint; y:cint):cint;cdecl;external;
{$endif}

implementation


end.      
Damit dies läuft muss ich noch von Hand {$link summe.o} einfügen.
Gibt es eine Möglichkeit das der Link zur Objektdatei automatisch generiert wird?

Für Antworten, Erklärungen auch weitergehende bin ich sehr dankbar.

Viele Grüße
Bernd

PS: hänge noch die Dateien an.
Dateianhänge
Test4.zip
(3.22 KiB) 139-mal heruntergeladen

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

Re: Wie funktioniert h2pas

Beitrag von theo »

H2pas kann dir viel Zeit sparen, aber es hat mir eher selten einen absolut pfannenfertigen Code geliefert.
Ohne etwas Beschäftigung mit C ist es schwierig, etwas hinzubekommen.
Normalerweise macht man damit Bindungen für DLL/SO.
Das mit dem object file {$link summe.o} weiss ich auch nicht, aber das ist ja nicht wirklich ein Problem oder?

Das mit dem #ifndef SUMME_H ist eine C "preprocessor technique":
https://stackoverflow.com/questions/324 ... not-in-cpp

Siehe auch:
https://wiki.freepascal.org/Common_prob ... ader_files

Benutzeravatar
Zvoni
Beiträge: 468
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Wie funktioniert h2pas

Beitrag von Zvoni »

wennerer hat geschrieben: Mi 29. Okt 2025, 10:25
Damit dies läuft muss ich noch von Hand {$link summe.o} einfügen.
Gibt es eine Möglichkeit das der Link zur Objektdatei automatisch generiert wird?

Für Antworten, Erklärungen auch weitergehende bin ich sehr dankbar.

Viele Grüße
Bernd

PS: hänge noch die Dateien an.
Das einzige was ich sehe ist die "-l library name"-option.
Nur bin ich mir gerade nicht sicher, ob das "-l" für "o"- oder "a"-Dateien gilt
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

wennerer
Beiträge: 642
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wie funktioniert h2pas

Beitrag von wennerer »

Hallo,
vielen Dank für die Antworten.

Theo schrieb:
Das mit dem #ifndef SUMME_H ist eine C "preprocessor technique":
In dem Link fand ich unter anderen das:
Dies ist eine Präprozessortechnik, um zu verhindern, dass eine Header-Datei mehrmals aufgenommen wird, was aus verschiedenen Gründen problematisch sein kann.
Das bedeutet für mich wenn der Header summe.h heißt muss ich #ifndef SUMME_H schreiben. Wenn die Header produkt.h hieße müsste ich #ifndef PRODUKT_H schreiben?

Zvoni schrieb:
Das einzige was ich sehe ist die "-l library name"-option.
Nur bin ich mir gerade nicht sicher, ob das "-l" für "o"- oder "a"-Dateien gilt
Also mit *,o Dateien passiert nichts. Was passiert wenn ich eine *.a Datei nutze probiere ich noch mal aus.

Wie würdet ihr es anfangen wenn es um mehrere Header Dateien geht. Jede einzeln oder ist es vorteilhafter gleich alle in h2pas hinzuzufügen. Spielt es dann eine Rolle in welcher Reihenfolge man die Bindings erzeugt?
Hintergrund ist folgender: ich versuche mich mal wieder an meinem ESP8266 und möchte diesen mittels UDP mit einer Funksteckdose verbinden. Viele Bindings stellt ccrause in seinem GitHub Repository bereit. Leider fehlen die Bindings für UDP.
Was ich gefunden habe ist eine Datei Namens liblwip.a. In der sind die *.o Dateien für UDP.
Und die nodemcu-firmware. Da drin sind die *.c und die *.h Dateien zufinden.

Das ich mit h2pas die Bindings nicht komplett fehlerfrei erstellen kann ist mir schon bewusst. Ich wäre aber für jeden Tipp dankbar wie man am Besten vorgeht um ein möglichst gutes Ergebnis zu erhalten. Und selbst dann wird es für mich sehr schwierig den Rest hin zu bekommen.

Viele Grüße
Bernd

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

Re: Wie funktioniert h2pas

Beitrag von theo »

wennerer hat geschrieben: Mi 29. Okt 2025, 20:30 Das bedeutet für mich wenn der Header summe.h heißt muss ich #ifndef SUMME_H schreiben. Wenn die Header produkt.h hieße müsste ich #ifndef PRODUKT_H schreiben?
Ich denke nicht, dass das eine Rolle spielt.
Warum interessiert dich das überhaupt? Das ist halt so ein C Gefrickel.
Willst du C schreiben oder Pascal?

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1663
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wie funktioniert h2pas

Beitrag von corpsman »

*g* passend zum Thema habe ich gestern meinen Artikel FPC_and_others veröffentlicht, in dem ich hoffentlich verständlich Zeige wie man C Quellen mit FreePascal verbinden kann, ggf ist das was für dich. Im Kern sehe ich das aber wie Theo, h2pas ist nur der Start, dann must du von Hand ran..
--
Just try it

wennerer
Beiträge: 642
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wie funktioniert h2pas

Beitrag von wennerer »

Guten Morgen,
das ich von Hand ran muss ist mir schon klar. Mir ging es darum Tipp's zu bekommen wie ich h2pas am besten füttere und einstelle.

@corpsman:
Habe deinen Artikel eben gelesen. Sehr interessant für mich. Ich habe auch versucht deinen Code zu kompilieren. Leider passiert folgendes wenn ich deine Install_libshared1_so.sh ausführe.
libshared.png
libshared.png (56.4 KiB) 328 mal betrachtet
Wo find ich die Datei?

Vielen Dank und viele Grüße!
Bernd

Benutzeravatar
Zvoni
Beiträge: 468
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Wie funktioniert h2pas

Beitrag von Zvoni »

wennerer hat geschrieben: Mi 29. Okt 2025, 20:30
Das mit dem #ifndef SUMME_H ist eine C "preprocessor technique":
In dem Link fand ich unter anderen das:
Dies ist eine Präprozessortechnik, um zu verhindern, dass eine Header-Datei mehrmals aufgenommen wird, was aus verschiedenen Gründen problematisch sein kann.
Das bedeutet für mich wenn der Header summe.h heißt muss ich #ifndef SUMME_H schreiben. Wenn die Header produkt.h hieße müsste ich #ifndef PRODUKT_H schreiben?
Jein.

Richtig heisst es: #ifndef DateinameDerHeaderDatei_H
Es ist egal WAS du in dem Header definierst. Es interessiert nur der tatsächliche Dateiname.

Was die Funktionsweise angeht: Als hinkender Vergleich:
Stell dir vor, du hast ne Pascal-Unit (!!) namens "summe.pas".
Diese benutzt du in form1.pas unter Uses.
In Form1 benutzt du aber noch eine Unit namens "meineGeileUnit" unter Uses, und "meineGeileUnit" hat wiederum selbst in Uses "summe".

FPC merkt aber, dass diese Unit schon geladen wurde resp. lädt die Units im Kontext der aufrufenden Unit, C/C++ kann das eben nicht, und erhält eine "doppelte Deklarierung".
Und dazu dient das #ifndef summe_h

Wenn du C-Header nach Pascal portierst kannst du das getrost sogar komplett weglassen
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: Wie funktioniert h2pas

Beitrag von theo »

wennerer hat geschrieben: Do 30. Okt 2025, 07:36 Leider passiert folgendes wenn ich deine Install_libshared1_so.sh ausführe.

libshared.png

Wo find ich die Datei?
Vielleicht zuerst build.sh ausführen? :roll:

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1663
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wie funktioniert h2pas

Beitrag von corpsman »

wennerer hat geschrieben: Do 30. Okt 2025, 07:36 Guten Morgen,
das ich von Hand ran muss ist mir schon klar. Mir ging es darum Tipp's zu bekommen wie ich h2pas am besten füttere und einstelle.

@corpsman:
Habe deinen Artikel eben gelesen. Sehr interessant für mich. Ich habe auch versucht deinen Code zu kompilieren. Leider passiert folgendes wenn ich deine Install_libshared1_so.sh ausführe.

libshared.png

Wo find ich die Datei?

Vielen Dank und viele Grüße!
Bernd
*g* wie theo bereits geschrieben hat, entweder Build ausführen oder wie in der Anleitung
hint.png
hint.png (30.71 KiB) 242 mal betrachtet
das STRG+F9 führt das Build automatisch mit aus ;)
--
Just try it

wennerer
Beiträge: 642
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wie funktioniert h2pas

Beitrag von wennerer »

Hallo zusammen,

@zvoni: Vielen Dank für die Erklärung. Damit kann ich was anfangen.

@corpsman: Ich hab es eigentlich mit Strg+F9 probiert. Leider hab ich nicht richtig aufgepasst und deshalb nicht bemerkt das ich die build.sh noch ausführbar machen muss. Das ist mir erst aufgefallen nachdem mich Theo mit der Nase drauf gestossen hat. Vielen Dank an euch beide.

Jetzt hab ich noch folgende Fehlermeldung:
Warning: linker: /usr/bin/ld: -lstdc++ kann nicht gefunden werden: Datei oder Verzeichnis nicht gefunden
Da werd ich morgen mal schauen was ich da noch installieren muss oder ob ich einen Symlink erzeugen muss. Habe Heute leider keine Zeit mehr.

Viele Grüße
Bernd

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

Re: Wie funktioniert h2pas

Beitrag von Mathias »

h2pas kann viel Arbeit abnehmen, aber es hat seine Tücken.
Zuerst muss man die *.h für h2pas Pfannenfertig machen und es darf beim ausführen keine Fehler mehr passieren.
Und auch nach dem fehlerfreien Durchlauf ist noch einiges an Arbeit angesagt. Ich habe dafür sogar ein Hilfsprogramm geschrieben, welches ein einiges an Arbeit abnimmt. So habe ich auch meine SDL3 und GTK4 Bindung gebaut.
Wen ein Paket aus mehreren C-Headern besteht dann ist noch Know-how erforderlich. Die übersetzen Dateien muss man dann in die richtige Reihenfolge bringen, ansonsten werden Abhängigkeiten nicht gefunden.
GLIB2, GTK4 und GST waren recht harte Brocken.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 1000
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Wie funktioniert h2pas

Beitrag von PascalDragon »

wennerer hat geschrieben: Mi 29. Okt 2025, 20:30
Das mit dem #ifndef SUMME_H ist eine C "preprocessor technique":
In dem Link fand ich unter anderen das:
Dies ist eine Präprozessortechnik, um zu verhindern, dass eine Header-Datei mehrmals aufgenommen wird, was aus verschiedenen Gründen problematisch sein kann.
Das bedeutet für mich wenn der Header summe.h heißt muss ich #ifndef SUMME_H schreiben. Wenn die Header produkt.h hieße müsste ich #ifndef PRODUKT_H schreiben?
Der Name des Defines ist an sich völlig irrelevant, so lange verschiedene Headerdateien nicht das gleiche Define haben, weshalb im allgemeinen der Dateiname verwendet wird. Man kann auch heutzutage einfach #pragma once statt dem ganzen #ifdef-Gedöns verwenden 😅
wennerer hat geschrieben: Mi 29. Okt 2025, 20:30
Das einzige was ich sehe ist die "-l library name"-option.
Nur bin ich mir gerade nicht sicher, ob das "-l" für "o"- oder "a"-Dateien gilt
Also mit *,o Dateien passiert nichts. Was passiert wenn ich eine *.a Datei nutze probiere ich noch mal aus.
Die -l Option ist nur relevant, wenn -D genutzt wird, was statt external allein external libname name funcname nutzt.
FPC Compiler Entwickler

Warf
Beiträge: 2226
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Wie funktioniert h2pas

Beitrag von Warf »

wennerer hat geschrieben: Mi 29. Okt 2025, 10:25 Hier kommt schon meine erste Frage:
Was genau macht hier:
#ifndef SUMME_H
#define SUMME_H
Ganz einfach, C hat im Gegensatz zu anderen Programmiersprachen wie z.B. Pascal, kein Konzept von Modulen (wie z.B. Pascal Units), Namespaces und co. Jede C Datei ist absolut eigenständig und weiß nichts von den anderen C Dateien. Wenn du jetzt 2 C dateien hast und daraus ein Programm baust musst du deinem C explizit sagen was es in der anderen Datei erwarten muss. Z.B. nehmen wir mal eine "lib.c":

Code: Alles auswählen

// lib.c
int add(int x, int y) { return x + y }
Jetzt hast du in deiner main.c wo du diese Funktion verwenden willst, dann musst du der main.c sagen das diese funktion existiert:

Code: Alles auswählen

// main.c
int add(int x, int y); // Forward definition ohne inhalt

int main() {
  return add(4, 2);
}
Hier wird jetzt die Funktion add aufgerufen die oben definiert ist. Da allerdings kein Funktionalität angegeben ist, weiß der Compiler "diese funktion wird irgendwann existieren", und ignoriert das ganze. Wenn du jetzt die main.o mit der lib.o zusammen linkst schaut der Linker nach und sieht das main.o ein add benutzt aber nicht definiert, dafür aber in der lib.o ein passendes add steht, also wird das dann dafür verwendet.

Das Problem ist nur, wenn du jetzt deine Lib.c in 5 dateien verwenden willst, willst du die "add" funktion ja nicht in allen 5 dateien nocheinmal auflisten, daher nimmst du die und schiebst sie in eine weitere Datei, diese nennst du dann .h, damit klar ist das es keine kompilierbare datei ist, du könntest sie aber auch .inc, .include oder .das_ist_keine_c_datei nennen, das ist komplett egal. In deinen .c Dateien kannst du die dann einfach über #include einbinden.
#inlcude macht nichts anderes als den gesammten inhalt der Datei an dieser stelle einzufügen. Das funktioniert dann soweit auch ganz gut. Jetzt musst du statt alle definitionen per hand rüber kopieren einfach nur die .h includen.

Das Problem was du jetzt aber hast ist das in der Praxis header Dateien oftmals selbst includes haben. Wenn du jetzt lib1.h hast und lib2.h, lib2.h included lib1.h und du jetzt in deinem Hauptprogramm sowohl lib1.h als auch lib2.h includest, würde alles doppelt vorkommen und der Compiler würde verrückt spielen. Daher brauchst du einen mechanismus um dafür zu sorgen das eine header Datei nur einmal eingelesen wird. Das kann man mit defines machen:

Code: Alles auswählen

#ifndef IRGENDWAS
// Dieser code wird nur beachtet wenn IRGENDWAS *nicht* definiert ist
#define IRGENDWAS
// Definiere IRGENDWAS, sodass das ifndef oben beim nächsten mal fehl schlägt
...
#endif // Endif zum ifndef
Im Grunde ist es also ein Hotfix für das Problem der Mehrfach includes, was es nur gibt weil includes ein Hotfix dafür sind das C kein Modulsystem hat.
wennerer hat geschrieben: Mi 29. Okt 2025, 10:25 Damit dies läuft muss ich noch von Hand {$link summe.o} einfügen.
Gibt es eine Möglichkeit das der Link zur Objektdatei automatisch generiert wird?
Das geht grundsätzlich nicht. H2Pas kann ja nicht wissen wie dein Object File am ende heißen wird. Es ist zwar grundsätzlich die Konvention das jede .c Datei eine .h Datei hat mit gleichem Namen, aber das ist mehr aus Bequemlichkeit und es gibt keinen technischen Grund warum das so sein sollte.
Wie bereits oben erwähnt sind .h Dateien kein fester Bestandteil der C Sprache, sondern sind einfach nur ein Hotfix damit man sich nicht dumm und dämlich tippt die selben Definitionen überall einzufügen. Theoretisch kannst du für jede funktion in deiner .c Datei eine eigene .h Datei anlegen. Du kannst auch eine .h Datei für alle deine .c dateien gleichzeitig schreiben. Von der .h Datei kannst du grundsätzlich nicht auf die .c Dateien schließen, und selbst von den .c Dateien kannst du nicht auf die .o dateien schließen:

Code: Alles auswählen

gcc -o libsumme.o summe.c
Das kompiliert dir deine summe.c nicht nach summe.o sondern nach libsumme.o. C hat kein allseits akzeptiertes Buildsystem, und jeder kann seine Buildscipts so schreiben wie man es für lustig hält. Ich selbst benutze für meine C Projekte ein Makefile template das sich über die Jahre immer weiter entwickelt das ich mir selbst ausgedacht habe.

Grundsätzlich kann man sagen, wenn du C Code in deinem Pascal Projekt benutzen willst, musst du zu einem gewissen Grad C können und wissen wie das Projekt aufgebaut ist. C ist zu flexibel und die C Welt ist extrem Heterogen das es nicht "einen" weg gibt C code zu bauen, geschweige denn in andere Sprachen einzubinden.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1663
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wie funktioniert h2pas

Beitrag von corpsman »

wennerer hat geschrieben: Do 30. Okt 2025, 18:35
Warning: linker: /usr/bin/ld: -lstdc++ kann nicht gefunden werden: Datei oder Verzeichnis nicht gefunden
Da werd ich morgen mal schauen was ich da noch installieren muss oder ob ich einen Symlink erzeugen muss. Habe Heute leider keine Zeit mehr.
Ui wenn du das alles weist, bitte einen Ping zurück an mich, dann füge ich es als "Anleitung" mit an. Da das bei mir alles schon immer läuft hatte ich das so nicht mehr aufm Schirm ..
--
Just try it

Antworten