Mit C das OS rausfinden



  • p1royal2 schrieb:

    @Dravere: Hab ja auch 3 Seiten lang auf was einfacheres gehofft. Ich kapiere das nämlich nicht, warum das mit der bedingten Kompilation nicht klappt, bzw. was da überhaupt vor sich geht.

    Das war schon eher klar. Was passiert ist folgendes:

    Bei einem Compiler ist eine bestimmte Version der C-Standardbibliothek dabei. In deren Headern stehen dann Sachen drin, die speziell auf das System ausgelegt sind, für das compiliert werden soll. Unter anderem wird zum Beispiel definiert, für welches Betriebssystem compiliert wird. Unter Linux steht dann also in irgendeiner der vielen Headerdateien die in deinen Code eingebunden werden:

    #define linux
    

    Dies ist ein Makro. Und da es definiert ist, ist es in deinem Code verfügbar. Die anderen nicht. Was nun bei deinem Code passiert ist folgendes:

    #ifdef WINDOWS           
        puts ("WINDOWS");
    #elif defined(WIN32)
        puts ("WIN32");
    #elif defined(linux)
        puts ("linux");
    #else
        puts ("nein");
    #endif
    

    Wenn "linux" gesetzt wird, geht der Preprozessor durch die #ifdefs durch und schaut welches gesetzt ist. Die die nicht gelten, überspringt er sie einfach inklusive dem Code den sie generieren würden. Am Ende ist nur "linux" definiert und nach dem preprozessor sieht dein Code für den Compiler nur noch so aus:

    puts ("linux");
    

    das ist dann das was auch in deinem Endprogramm steht. Wenn du das programm disassemblierst und dich durch die Datei wühlst, wirst du die strings "WINDOWS" oder "WIN32" nicht mehr finden können. Sondern nur eine Ausgabe für "linux".



  • Aber dann bin ich doch schon meiner Lösung ganz nah. Was ich mache, ist mit if abfragen das richtige zu finden. Kann ich nicht aus der Standardbibliothek des Herstellers die Header rauslesen oder hinschreiben lassen? Mit der Information kann ich doch weiter experimentieren!?



  • Dir fehlt elementares Grundwissen. Lern programmieren, bevor du programmierst.



  • p1royal2 schrieb:

    Kann ich nicht aus der Standardbibliothek des Herstellers die Header rauslesen oder hinschreiben lassen?

    Du kannst dir ja mal die Headerfiles anschauen, die beim Compiler dabei sind. Vielleicht bringts dir ja was. Wenn dort irgendwo steht

    #define CIPHERLAB_OS
    

    dann... tja, was dann?



  • ...nerv ich euch nicht mehr...

    Aber ich bin jetzt zuhause und kann erst morgen wieder schauen.



  • Nutz die Zeit Zuhause um C zu lernen. Dir fehlt elementares Grundwissen.



  • Mach ich schon, keine Sorge. Nur konnten mir gerade die Bücher keine Antwort auf diese Frage geben. Aber ich muss es beruflich jetzt sofort anwenden und bis auf diese Frage, kapier ich genug um mein Programm zu beenden. Den Rest lerne ich schon. Versprochen. Und solang danke für die Unterstützung in meinen Wissenslücken...



  • http://de.cipherlab.com/catalog.asp?CatID=7&SubcatID=93&ProdID=268&view=features schrieb:

    Mit der Power Suite von CipherLab erstellen Sie benutzerdefinierte Anwendungen:
    FORGE Application Generator einschließlich OCX-Modul zur Datenübertragung, STREAM Wireless Studio, MIRROR Terminal Emulation, BLAZE C Compiler und BASIC Compiler.

    Der Compiler bringt sicher seine eigene Dokumentation mit. Wenn du wissen willst, was da für Bibliotheken dabei sind, ist das ein guter Anlaufpunkt.

    Was willst du eigentlich wissen?
    🙂



  • Welches OS auf dem Gerät läuft damit ich weiter Bibliotheken suchen. Ziel wäre, ohne ein Zwischenprogramm auf einem anderen PC, aus Oracle DB7 und MySQL auszulesen. Idealer eine ODBC Bibliothek. Davon gibt es viele und in vielen Variationen. Jetzt diskutieren wir ob es (was ich mittlerweile befürchte) ein eigens entwickeltes OS auf dem Gerät läuft, oder was verbreitetes...



  • Mitgelieferte Dokumentation lesen. So einfach ist das.


  • Mod

    mngbd schrieb:

    Was willst du eigentlich wissen?
    🙂

    Ich fürchte hier liegt ein Fall vor, wo der Fragesteller zu wenig über Programmierung weiß, sowohl um eine passende Frage zu stellen, als auch um überhaupt die Antworten zu verstehen die ihm gegeben wurden (und die mehr oder weniger zu dem passen, was er vermutlich meint). Daher ist ein bisschen Detektivarbeit angesagt:

    Was wir wissen:

    • Der Fragesteller will ODBC benutzen
    • Die ODBC-Bibliothek selbst beinhaltet auch Binärpakete, die natürlich nicht plattformunabhängig sind
    • Es gibt aber auch Sourcecode für die Binärpakete
    • Der Threadersteller kennt das Zielsystem nicht
    • Der Threadersteller hat einen Compiler für das Zielsystem

    Folgerung:

    • Der Threadersteller will das Betriebssystem wissen, weil er sonst nicht weiß, welches Binärpaket er runterladen soll
    • Das eigentliche Ziel des Threaderstellers ist es, auf seinem unbekannten System ein Programm zum Laufen zu bekommen, dass Funktionen aus der ODBC-Bibliothek verwendet

    Lösungsvorschlag:

    • Sourcecode der Bibliothek runterladen, selbst compilieren.
    • Hoffentlich versteht der Threadersteller diesen Vorschlag und wird nicht gleich wieder unhöflich.


  • p1royal2 schrieb:

    Jetzt diskutieren wir ob es (was ich mittlerweile befürchte) ein eigens entwickeltes OS auf dem Gerät läuft, oder was verbreitetes...

    Naja, sowas wie die üblichen Unix-Systeme ist vielmehr ein Baukasten als das, was du vielleicht von einem Betriebssytem erwartest. Nur vom Namen her kann man mit sowas auch nicht sagen, ob es dieses oder jenes Feature anbietet. Egal, wie gut du nun C kannst, musst du dich jedenfalls durch die Dokumentation wühlen, ich schätze nicht, dass es allzu viele fertige Software gibt, die genau für dieses Gerät entwickelt wurde.

    Ich hab immer noch keine Ahnung, was genau du damit eigentlich anstellen willst (ausser dass es auch mit Sockets und einem Webserver gehen könnte). Falls ich nichts übersehen habe: beschreib das mal genauer.
    🙂



  • @SeppJ: Danke Sepp, genauso meinte ich es auch. Entschuldige dann bitte meine ungenaue Beschreibung. Zu deinem Lösungsvorschlag, die benötigte Bibliothek benötigt eben viele unterschiedliche Standardbibliotheken. Beim selber kompilieren der Bibliothek bin ich irgendwann festgefahren. Wenn ich allerdings wüsste das es ein z.B. FreeBSD ist, wäre mir dein Vorschlag leichter.

    Und sei nicht fies, ich werde nur unhöflich wenn man mich beleidigt, ansonsten bin ich wirklich wirklich dankbar für jede Idee auf die ich nicht selber komme. "Lass es sein", "Doku lesen" oder "lern erstmal programmieren" ist mir keine Hilfe, sowas wie deine Vorschläge hingegen schon.

    @mngbd: Also Ausgangspunkt ist dieses Gerät. Dazu kam ein C Compiler für Windows (Kommandozeile). Ich habe schon mein komplettes Programm fertig (Firmeninterne Lagerverwaltung), habe erfolgreich eine W-Lan Verbindung zu einem Access-point programmiert und pinge mit diesem Gerät munter durch unser Netzwerk. In diesem Netzwerk ist auch ein Warenwirtschaftssystem-Server mit einer Oracle Datenbank.

    Beispiel:
    - Wareneingang von 5 Lichtschranken
    - Mensch mit Scanner lagert diese ein
    - Mensch mit Scanner scannt den Strichcode an der Kiste
    - Scanner hat eine Zahl, fragt bei der Oracle DB nach dem aktuellen Bestand für diese Zahl
    - Mensch überprüft
    - Mensch tippt ein: 5 hinzufügen
    - Scanner aktualisiert DB

    Ich brauch nur die Bibliothek für eine Oracle DB Kommunikation!
    Alternative:
    - Scanner ruft Webserver auf "index.php?strichcode=123456"
    - index.php läuft auf Unix, Oracle Bibliothek vorhanden in Form von ODBC
    - index.php fragt die Oracle DB
    - Antwort als Ausgabe zurück an Scanner

    Das ganze würde über Sockets super laufen. Aber das ist keine Elegante Lösung und wir bräuchten einen dauernd laufenden Webserver...



  • man könnte mittels system() testen, ob bestimmte Programme aufrufbar sind, anhand deren Existenz man die OS-Familie erkennen kann. zB cmd.exe => dann wird's wahrscheinlich *n*x eher nicht sein. Mit detailierteren Abfragen könnte man dann genaueres ermitteln, zB mit uname -a.



  • Das ganze würde über Sockets super laufen.

    Dann mach es so oder so ähnlich. Es reicht ja eigentlich, wenn irgendwo nen Server lauscht. Muss ja kein Webserver sein.



  • @zum Beispiel: Das klingt nicht schlecht. Ist aber wieder nach dem Ausschlußverfahren. Was auch bedeutet, ich muss für alle möglichen OS Standard Befehle finden.

    @otze: Klar, aber das wäre halt eben nicht ideal. Es fehlt ja nur die richtige Bibliothek für die saubere Lösung.

    Ich schau mir aber erst mal genauer die Headerfiles an, vielleicht finde ich dort einen Hinweis. Aber halt leider erst morgen.



  • Manchmal ist bei Problemen auch Forschungsarbeit angesagt. Das hier habe ich in wenigen Minuten gefunden:
    http://www.codeware.cz/eng/produkty/CPT-8071_WLAN_CipherLab_58.html

    In the basic set you will receive everything you need to set the device up - including the CD-ROM with a program with which you can connect the terminal to any MS Excel sheet and start working in a few minutes. Of course, there must be a standard IEEE 802.11b Access Point in the signal range (within a distance of 250 meters). Through one access point you can manage as many CPT-8071s as you want. Another tool, which you will find in our package, is the DLL library. With this application you can connect the terminal to any ODBC database (Oracle, Sybase, MySQL, Informix, Firebird, etc.).

    Ist zwar ein anderes Modell aber es scheint zumindest ein ansatz für DB zugriff zu sein. Ich denke man findet da sogar noch mehr dazu.



  • Als aller erstes Mal, super Fund, echt mal was neues für mich. Vor allem wirkt die Software als wäre Sie von der Tschechischen Firma selbst programmiert. Leider macht es den anscheinend als wäre es wieder ein zwischen Programm und es quasi als Brücke fungiert. Irgendwie sogar in Form einer Datei die ich übertrage und dann auslese. Anscheinend hat sich schon mal jemand an so ein Gerät probiert und hat es auch über einen externen PC gelöst...



  • Also das OS zur Laufzeit herausfinden geht nicht, allerhöchstens die Version (Windows XP oder Windows 7).

    Da du Sockets benutzen kannst, sprich die Datenbank doch direkt an. Die Bibliothek würde das ja genauso machen.
    Du müsstest ja nur die Datenbankbefehle einbauen, die du brauchst (Wert abfragen/setzen).

    Das würde meiner Meinung nach schneller gehen als eine fertige Bibliothek zu suchen oder auf die Antwort des Herstellers zu warten.



  • Guten Morgen liebe Sorgen...

    Also, folgendes, über Nacht kam eine Mail aus Taiwan: Eigen entwickeltes OS

    In den Header Dateien ist nicht viel zu finden bis auf

    /* Copyright(C) 1994 TOSHIBA CORPORATION  All rights reserved */
    /*      $RCSfile: stdlib.h $    */
    /*      $Revision: 1.2.1.5 $    */
    /*      $Date: 1995/01/31 17:40:00 $    */
    /* Modified by Syntech Information on Mar 21, 1997 */
    

    und das zieht sich so ungefähr durch alle Header Dateien. Bei Syntech bin ich auf diese Seite gestossen. Auch erstmal nicht Hoffnungsweckender Eindruck.

    Den Funktionsaufruf system() kann er nicht...

    if( system(NULL) == 0) {
         printf("Kein Kommandoprozessor vorhanden");
      }
      else printf("Kommandoprozessor vorhanden");
    

    lässt der Compiler nicht zu.

    Also lass ich jetzt die Finger von einer Fremdlibrary und löse es jetzt über Socket und Drittprogramm.

    @irgendwer: Da hab ich ehrlich gesagt schon etwas mehr Respekt davor. Ich finde ja nichtmal wie die Socketpakete für Oracle ausschauen müssen...


Anmelden zum Antworten