Funktionsbibliothek zur Ansteuerung von Druckern



  • Hallo

    Ich möche eine Funktionsbibliothek entwickeln, die eine einheitliche Ansteuerung von Drucker bewirken soll. es soll nur die 4 druckertypen umfassen. ESC->USB;ESC->seriell;PCL->USB;PCL->seriell
    Ich kenn mich mit dieser Problematik leider nicht so gut aus. hab zwar ne header-datei gegeben die ich vervollständigen soll, weiß aber nicht wie und wo.

    #if !defined _LIBPRINTER_H_1164006234
    #define _LIBPRINTER_H_1164006234
    
    #include <libprinter_intern.h>
    
    #include <stdio.h>
    
    #if !defined _INT8_
    #define _INT8_
    /**
     * \typedef int8
     *
     * vorzeichenbehafteter 8bit-Wert
     */
    typedef signed char int8;
    #endif
    
    #if !defined _UINT8_
    #define _UINT8_
    /**
     * \typedef uint8
     *
     * vorzeichenloser 8bit-Wert
     */
    typedef unsigned char uint8;
    #endif
    
    #if !defined _INT16_
    #define _INT16_
    /**
     * \typedef int16
     *
     * vorzeichenloser 16bit-Wert
     */
    typedef signed short int int16;
    #endif
    
    #if !defined _UINT16_
    #define _UINT16_
    /**
     * \typedef uint16
     *
     * vorzeichenloser 16bit-Wert
     */
    typedef unsigned short int uint16;
    #endif
    
    #if !defined _INT32_
    #define _INT32_
    /**
     * \typedef int32
     *
     * vorzeichenbehafteter 32bit-Wert
     */
    typedef signed long int int32;
    #endif
    
    #if !defined _UINT32_
    #define _UINT32_
    /**
     * \typedef uint32
     *
     * vorzeichenloser 32bit-Wert
     */
    typedef unsigned long int uint32;
    #endif
    
    #define LIBPRINTER_MAJOR_VERSION			0
    #define LIBPRINTER_MINOR_VERSION			1
    
    #define LIBPRINTER_USB_ESC_PRINTER			1
    #define LIBPRINTER_USB_PCL_PRINTER			2
    #define LIBPRINTER_SER_ESC_PRINTER			3
    #define LIBPRINTER_SER_PCL_PRINTER			4
    
    /**
     * \brief Initalisiert die Bibliothek
     *
     * \return Fehlerwert
     */
    int16 libprinter_init ();
    
    /**
     * \brief Deinitialisiert die Bibliothek
     *
     * \return Fehlerwert
     */
    int16 libprinter_finalize ();
    
    /**
     * \brief Druck den Inhalt der Datei aus
     *
     * \param *filename Die zu druckende Datei
     * \param uiPrinter der Drucker
     *
     * \return Fehlerwert
     */
    int16 libprinter_print_file (const char *filename, uint8 uiPrinter);
    
    /**
     * \brief Druckt den Inhalt der Datei aus
     *
     * \param *file die zu druckende Datei
     * \param uiPrinter der Drucker
     *
     * \return Fehlerwert
     */
    int16 libprinter_print_file_descriptor (FILE *file, uint8 uiPrinter);
    
    /**
     * \brief liefert die Version der Bibliothek
     *
     * \param *cStr bereits allokierter String, in den die Versionsnummer geschrieben wird
     *
     * \return Fehlerwert
     */
    int16 libprinter_get_version (char *cStr);
    
    /**
     * \brief liefert die einzelnen Versionsnummern
     *
     * \param *pMajorVersion die Hauptversionsnummer
     * \param *pMinorVersion die Nebenversionsnummer
     * \param *pSubVersion die Unterversionsnummer
     * \param *pBuiltVersion die Build-Nummer
     *
     * \return Fehlerwert
     */
    int16 libprinter_get_version_numbers (uint16 *pMajorVersion, uint16 *pMinorVersion, uint16 *pSubVersion, uint16 *pBuiltVersion);
    
    #endif // _LIBPRINTER_H_1164006234
    

    Kann mir da jemand bitte helfen oder ein paar nette tipps geben?

    MFG

    PS: Dieser Beitrag könnte auch zu API passen, denk aber das er hier besser reinpasst



  • Also die "init" Funktion einen "struct my_library*" zurückgeben zu lassen ist schonmal meistens eine gute Idee, und den nehmen dann alle Funktionen als erstes Parameter. Das spart z.B. schonmal viel Kopfschmerzen wenn mehrere Programmteile die Library verwenden.
    Intern darfst du dann keinen globalen State verwenden, alles was man sonst global machen würde macht man dann eben in diese "struct my_library" rein.

    Weiters wäre es vielleicht gut wenn sich die Library selbst merkt was für ein Druckertyp angehängt ist, dann muss man das der "libprinter_print_file" Funktion nicht immer mitgeben. Vorteil: die Funktionen die bloss drucken wollen müssen nur einen gültigen "struct my_library*" als Parameter mitbekommen und können schön drucken, müssen aber nicht wissen was für ein Drucker gerade konfiguriert ist.

    Und auf eigene Typedefs ala "uint16" würde ich verzichten wenns nicht unbedingt notwendig ist. Nimm einfach den kleinsten Standardtyp der dir die benötigte Anzahl an Bits garantiert, und im Zweifelsfall immer "int" oder "unsigned int" (wenn 16 Bit genug sind). Zumindest in den Header Dateien. Innerhalb der C Files kannst du dich austoben, bzw. auch in "privaten" Header Dateien -- also solche die der Benutzer der Library weder direkt noch indirekt jemals inkludieren kann.



  • Danke für deine tipps.

    Aber ich komm drotzdem nicht weiter, es will einfach nicht funktionieren und er druckt einfach nichts. er soll ja nur am anfang ne einfache *.prn datei ausdrucken.

    Ach das ist zum verzweifeln.

    Ich glaub ich brauch bessere programmier kenntnisse 😞

    Vielleicht kannst du mir ja doch noch ein paar tipps geben.

    MFG



  • Lol. Was für Tips denn? Tips kann ich dir zum Interface Design geben, aber wenn dus nichtmal hinbekommst den Drucker überhaupt irgendwie anzusteuern... ?



  • hustbaer schrieb:

    Und auf eigene Typedefs ala "uint16" würde ich verzichten wenns nicht unbedingt notwendig ist. Nimm einfach den kleinsten Standardtyp der dir die benötigte Anzahl an Bits garantiert, und im Zweifelsfall immer "int" oder "unsigned int" (wenn 16 Bit genug sind). Zumindest in den Header Dateien. Innerhalb der C Files kannst du dich austoben, bzw. auch in "privaten" Header Dateien -- also solche die der Benutzer der Library weder direkt noch indirekt jemals inkludieren kann.

    Auf Typedefs wie Int32, Int16 wuerde ich AUF KEINEN FALL verzichten!!!!! 😮



  • ich dachte das forum sei da um hilfe zu bekommen.
    jeder fängt nun mal klein an und am anfang weiß man halt noch nicht viel drüber.

    deshalb hab ich ja nach ein paar netten tipps gefragt.





  • @Blue-Tiger:

    Auf Typedefs wie Int32, Int16 wuerde ich AUF KEINEN FALL verzichten!!!!!

    Begründung?

    @The_Mad_Max:

    ich dachte das forum sei da um hilfe zu bekommen.
    jeder fängt nun mal klein an und am anfang weiß man halt noch nicht viel drüber.

    deshalb hab ich ja nach ein paar netten tipps gefragt.

    Ok. Gut. Dann solltest du vielleicht etwas mehr dazu schreiben was das für Drucker sind und was die Lib genau tun soll etc.

    Ich kenne z.B. keine "ESC" Drucker, ich kenne bloss "ESC/P2" welches eine "Durckersprache" ist (von Epson) -- sind die irgendwie verwandt?
    Und "PCL" sagt mir garnix.

    Oder gehen wirs mal von der anderen Seite aus an: womit genau hast du Probleme/was bekommst du nicht hin? Ich hasse es wenn Leute sagen "geht nicht" und dann Tips erwarten -- WAS genau geht nicht/kannst du nicht?



  • ESC und PCL sind beides druckersprachen, einmal mehr für nen nadeldrucker und das andere mehr für einen laserdrucker. ESC/P2 ist bloß etwas älter und wird von der PCL(Hewlett-Packard) immer mehr abgelöst.

    bei mir scheidert es irgendwie am verständnis der aufgabe, weil bisher hab ich drucker immer über cups angesteuert und weiß jetzt nicht genau wie ich die jetzt ansteuern soll, weil ich mit der druckersprache nicht zurecht komm, wären es nur ps(postscript)drucker, wäre das ja ganz einfach. da brauch ich nur jede erdenkliche datei in eine ps-datei umwandeln und an den drucker schicker, der druckt das dann von alleine.

    also ich weiß nicht wie und wo ich anfangen soll, hab ja auch schon eine bibliothek gegeben, nur weiß ich nicht wie ich die einbinden soll. sprich am einfachsten liegt es und was ich für befehle brauch.



  • Ok. Gut. Soweit. Dann stell jetzt mal konkrete Fragen. Es wird dir hier keiner eine komplette Druckeransteuerung bzw. Anbindung an irgendeine Lib schreiben.



  • OK.

    Kannst du mir da verraten wo ich so ein tutorial finde zu diesen themen, Drucker ansteuern und lib einbinden.??
    oder irgendwelche bücher etc. wo ich es nachlesen kann. denn von alleine komm ich glaube nicht dahinter, leider 😞



  • Ich bin mir nicht sicher, wie das genau funktioniert. Aber normalerweise nimmt man Postscript-Quelltexte (ja, Postscript ist eine Programmiersprache!) und wandelt die mittels eines Postscript-Interpreters und einem entsprechenden Treiber in die Beschreibungs-Spache des Druckers um (außer man ist in der glücklichen Lage einen Postscript-Drucker zu besitzen). In der Regel wird als Interpreter Ghost-Script verwendet.

    Nun reichst du eben Postscript an Ghostscript weiter (hat eine C-API das Ding) und schiebst das Ergebnis an den entsprechenden Drucker.



  • ja das hab ich mir auch schon gedacht alles in PS zu konvertieren und dann zu einer druckersprache umwandeln.
    nur ich weiß nicht wie ich von PS zu ESC oder PCL konvertiere(oder umwandel).????



  • The_Mad_Max schrieb:

    nur ich weiß nicht wie ich von PS zu ESC oder PCL konvertiere(oder umwandel).????

    Entweder nimmst du eben Ghostscript oder einen anderen Postscript Interpreter oder du musst dir selbst einen schreiben (Tipp: Das ist keine kurze und einfache Aufgabe)


Log in to reply