Forum: PC-Programmierung (wx, C++): Rohdaten an Windows Drucker senden?


von leif (Gast)


Lesenswert?

Hallo Profis,

ich suche nach einer Möglichkeit, Rohdaten (Prescribe Befehle) an
meinen Kyo FS-1020D Drucker (USB/Parallel) zu senden.

Ich habe schon ein kleines GUI mit wxWidgets gebaut, und würde am
liebsten damit weiterarbeiten, da die Druckerauswahl schon als Widget
vorhanden ist.

Leider habe ich bislang noch keine Information darüber finden können,
wie sich reine ASCII Daten an den Drucker senden lassen. Weiß jemand,
wie das gehen könnte, oder hat andere Vorschläge (Sprache,
GUI-Toolkit)? Kann QT sowas?

Zur Not könnte ich den Drucker auch am Parallelport betreiben, da
sollte mein Vorhaben doch einfacher sein, oder?

Gestresst, leif

von Jens (Gast)


Lesenswert?

copy /b datei lpt1:

Wenn der Drucker am Parallelport hängt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das sollte so gehen:

Drucker als Netzwerkdrucker freigeben

und -beispielsweise- in der Konsole ("Eingabeaufforderung") folgendes
eingeben:

  dir > \\rechnername\druckerfreigabename

oder

  copy testdatei.txt \\rechnername\druckerfreigabename

(wenn Steuerzeichen enthalten sind, ist ein Anhängen von /b hilfreich)

So kannst Du Deine "Prescribe Befehle" auch erstmal zu Testzwecken in
eine Datei schreiben und diese so auf den Drucker ausgeben.

Mit dem UNC-Namen "\\rechnername\druckerfreigabename" kannst Du
auch mit normalen Dateizugriffsfunktionen (fopen etc.) aus Deinem
Programm heraus auf den Drucker zugreifen.

Der "Umweg" über Netzwerkfreigabe/UNC-Namen ist sicherlich auch nicht
erforderlich, nur verwende ich keine lokal angeschlossenen Drucker und
müsste etwas Nachforschung für die genaue Syntax anstellen.

Allerdings stellt sich bei solchen "Lösungen" die Frage, ob es
wirklich sinnvoll ist, mit dem Drucker auf dieser direkten Ebene zu
kommunizeren; sobald der Drucker durch einen anderen ersetzt wird, der
mit einer anderen Druckersteuersprache (PCL, Postscript etc.)
angesteuert wird, ist Deine Anwendung mindestens zu überarbeiten.

von Stefan Kleinwort (Gast)


Lesenswert?

Wenn die Daten als File vorliegen: schau Dir mal Printfile an.

Viele Grüße, Stefan

von leif (Gast)


Lesenswert?

Tausend Dank! Danke! Ahh.

Nachdem das Dateiumleiten (natürlich ;) geklappt hat, bin ich auf
codeproject.com auf einige interessante Berichte gestoßen, wo ich das
mit dem 'Netzwerktrick' gesehen habe. So ganze wollte ich es nicht
glauben, aber wenn Rufus es sagt, wird es stimmen und funktionieren.

Das Programm ist wirklich winzig und soll nur Etiketten mit vom Drucker
erzeugten PDF 417 Barcodes bepflastern. Das könnte man natürlich auch
alles in Software machen/kaufen, aber das lohnt sich für mich nicht.

@ Stefan:
Du meinst vermutlich http://www.lerup.com/printfile/ ..
Ja, wäre vielleicht auch eine Möglichkeit das Programm dann mit nem
Systembefehl aufzurufen.

Ich probier's mal über die Netzwerkfunktion, wenn das klappt wäre ich
ein Stück froher..

Überschwenglichsten Dank an Euch!

von Katzeklo (Gast)


Lesenswert?

> So ganze wollte ich es nicht glauben, aber wenn Rufus es sagt,
> wird es stimmen und funktionieren.

Genau!

von leif (Gast)


Lesenswert?

So, leider kommt

C:\>copy /b print \\leif\kyocera1
Das Netzlaufwerk ist nicht erreichbar. Weitere Informationen üb...
on Netzwerkproblemen finden Sie in der Windows-Hilfe.
        0 Datei(en) kopiert.

Firewall aus, ich kann mich sogar im Explorer sehen, wenn ich meinen
eigenen Rechner suche, freigegeben ist er.

Läßt sich die Verbindung irgendwie testen?

von Jens (Gast)


Lesenswert?

Ist denn der Drucker auch explizit freigegeben?

von leif (Gast)


Lesenswert?

Es funktioniert, wenn ich den Computernamen groß schreibe!

System-Computername -> wird klein angezeigt

Drucker: Eigenschaften-Sicherheit:
"Benutzer(COMPUTERNAME\Benutzer)"

Dann seh ich mal zu, ob ich's auch aus dem Programm hinbekomme!

von leif (Gast)


Lesenswert?

Grandios!

Ich weiß nicht, ob das gültiges C++ ist, aber es funktioniert:

     FILE *fp = fopen("\\\\COMPUTER\\druckerfreigabename",
"w");
                fprintf(fp,"Da bist Du platt!\n");
                fclose(fp);


Danke!

von Christoph _. (chris)


Lesenswert?

> Ich weiß nicht, ob das gültiges C++ ist

AFAIK ist es gültiges C++, sofern du "#include <cstdio>" und "using
namespace std;" (oder ein äquivalentes "using") irgendwo oben drüber
stehen hast. Pfadangaben sind soweit ich weiß nicht vom C++-Standard
genormt.

Funktionieren wird es mit diesem Pfad vermutlich trotzdem nur unter
Windows.

btw, für I/O benutzt man in C++ eher streams (Stichwort <fstream>).

von leif (Gast)


Lesenswert?

Man sollte nicht vergessen, eine Leerzeile bzw. ein \n am Ende der
Datei / Daten einzufügen. Sonst denkt der Drucker evtl., es kommt noch
was, und druckt erst, wenn neue Daten ankommen.

von Amir (Gast)


Lesenswert?

Um die aktuelle Seite zu drucken brauchste einfach nur nen Button
erstellen mit dem Befehl Print();
schon druckt er dir deine seite.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hast Du die Frage am Anfang dieses Thread überhaupt gelesen?

von Sascha (Gast)


Lesenswert?

Dieser Thread ist zwar schon "uralt", da ich heute aber das gleiche 
Problem hatte hier meine Lösung:

http://support.microsoft.com/kb/138594/de

Funktioniert mit Prescribe einwandfrei und ist deutlich eleganter als 
die Sache mit den Netzwerkdruckern.

Grüße,

Sascha

von Frank (Gast)


Lesenswert?

Die meisten mir bekannten Kyocera-Drucker mit einem Web-GUI haben dort 
eine Funktion drin, PS- bzw. KPDL-Daten hochzuladen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.