Autor Beitrag
recall
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: So 03.07.05 07:39 
Hallo,

Ich will einen virtuellen Druckertreiber schreiben. Ihr kennt vielleicht so einen "PrintToPDF" o.ä.
Ich möchte also einen Drucker in der Auswahl haben, wo die Daten an eine exe von mir geschickt werden.
Oder muss ich das anders lösen ?

Ich habe nämlich so gut wie keine Ahnung davon ;)

In welchem Format kommen denn die Daten an ? ps ?

Wäre schön wenn irgendwer IRGENDwelche Informationen für mich hätte.

Viele Grüße.
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: So 03.07.05 09:35 
Also, wennn du einen Treiber schreiben willst, solltest du erstmal auf C umsteigen oder den wirklich komplizieren Delphiweg gehen. Ich würde es anders machen. Schreibe dir ein Programm, dass auf einem TCP Port lauscht und dort einen IPP Server bereitstellt. Das Protokoll ist gut protokolliert und für einfaches Drucken sind nicht soo viele Programmzeilen nötig. Du erhälst die Daten je nach Druckertreiber, den du in Windows auswählst. Ich habe für meinen virtuellen IPP Drucker einen Postscriptdruckertreiber gewählt. Das funktioniert wirklich gut und ist auf jeden Fall einfacher als einen Treiber zu schreiben.

Gruß,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
recall Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: Mo 04.07.05 11:37 
Danke für deine Antwort, die Lösung hört sich gut an.
Aber leider habe ich keine Ahnung, wo ich das Protokoll herkriegen soll (google ich weiß...).
Hast du vll. noch eine Seite, die du empfehlen kannst, ein tut oder ähnliches ?
Wenn du das schon geschrieben hast (oder sowas ähnliches), könntest du mir den codeteil schicken ?

Wie registriere ich denn den TCP-Server als Drucker ? Ich will ja, dass der User in einem beliebigen Programm
auf drucken gehen kann und meinen virtuellen Treiber auswählen kann !

Viele Grüße.
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mo 04.07.05 14:24 
Ab Windows 2000 ist es Möglich einen Netzwerkdrucker hinzuzufügen, der via IPP angesprochen wird. Alle anderen Windowsversionen benötigen Updates. Der fertige Drucker erscheint dann als Netzwerkdrucker in jeder Anwendung und du kannst ganz normal drauf drucken. Mit Treiberprogrammierung hat das dann aber nix mehr zu tun ;)

IPP ist ein gut dokumentiertes Protokoll, sodass ein Blick in die Suche bei Google ENTSPRECHENDE RFC helfen sollte. Ich habe mal ein Programm für meine Schule geschrieben, dass unseren für unseren Onlinevertretungsplan (darum OVP) zuständig sein sollte - leider gab es Probleme auf Grund unserer Netzwerkstruktur, so dass das Programm nie wirklich benutzt wurde. Dann hat es jetzt doch noch einen Sinn :D

Gruß,
maxk
Einloggen, um Attachments anzusehen!
_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
recall Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: Di 05.07.05 09:15 
Tausend Dank für die umfassende Antwort.
Das Programm hilft mir echt weiter :)
recall Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: Mi 06.07.05 10:47 
hmmm... vielleicht war ich zu voreilig.
Ich krieg es nicht hin, mit dem Programm etwas zu drucken.

Erstmal hab' ich einen neuen Drucker (TCP/IP Port 631) hinzugefügt. Treiber: Windows Text.
Dann habe ich die .conf-Datei angepasst, so dass er mir eine Datei ausgeben soll.
Die Daten werden erst an den Spooler geschickt, aber auch "direkt an den Treiber schicken"
hat nix geholfen.

Wenn ich z.B. in Notepad dann etwas auf dem Drucker (Vertretungsplandrucker) drucke, passiert nichts !

Ich hab mal Haltepunkte gesetzt, aber irgendwie wird die DoExecute-Routine nicht aufgerufen,
wenn ich auf drucken gehe. Ich denke mal, das liegt an meinen Einstellungen vom Drucker !?

Was mache ich falsch ?

Viele Grüße.

P.S.: Kannst du mir
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  while GetMessage(Msg,0,0,0do begin
   Translatemessage(Msg);
   Dispatchmessage(Msg);
  end;
erklären ?

Und du meintest noch:
Zitat:
Ab Windows 2000 ist es Möglich einen Netzwerkdrucker hinzuzufügen, der via IPP angesprochen wird. Alle anderen Windowsversionen benötigen Updates.

Daher habe ich versucht, den Vertretungsplandrucker als Netzwerkdrucker hinzuzufügen. Der wird aber nicht gefunden !?
Und was meinst du mit "die älteren Versionen müssen upgedatet werden" ? Wie upgedatet ?

Vielen Dank im voraus :D
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mi 06.07.05 11:24 
IPP wird seit Windows 2000 unterstützt. Für die anderen Windowsversionen (das habe ich jedenfalls gelesen) gibt es Patches von Microsoft, die Windows das neue Drucksystem beibringen. Wie genau das geht, kann ich dir nicht sagen, da ich mich damit nicht weiter beschäftigen musste.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  while GetMessage(Msg,0,0,0do begin  
   Translatemessage(Msg);  
   Dispatchmessage(Msg);  
  end;
Sorgt dafür, dass die Anwendung solange offen bleibt, bis sie die Nachricht erhält, dass sie geschlossen werden soll. Sonst würde die Anwendung gleich nachdem Öffnen wieder zu gehen. Es ist im Prinzip das Selbe wie: while not Application.Terminated do Application.HandleMessage;

Zitat:
Ich hab mal Haltepunkte gesetzt, aber irgendwie wird die DoExecute-Routine nicht aufgerufen, wenn ich auf drucken gehe
Das hört sich nicht gut an. Wie hast du den Drucker in Windows hinzugefügt? Neuer Drucker/Netzwerkdrucker/"Verbindung mit Drucker in Heimatnetz (URL)" => localhost:631/printers/default?
Windows sollte dabei eigentlich automatisch den Namen des Druckers ermitteln können, wobei DoExecute aufgerufen wird. Hast du mal versucht im Browser localhost:631/ zu öffnen? Normalerweise muss der Drucker auch nicht weiter konfiguriert werden! Ich habe es mit dem Canon CP660PS Treiber probiert und es hat auch Anhieb funktioniert. Die .conf sollte wie folgt aussehen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
PrinterName=Vertretungsplandrucker

# Wenn es Probleme gibt, erstmal alles erlauben!
AllowLocalOnly=1

# Sollen die Druckaufträge als Datei gespeichert werden (1=Ja, 0=Nein)
SaveJob=1
SaveJob.Filename=C:\Test.prn

# Upload brauchen wir nicht!
UploadJob=0
UploadJob.Host=
UploadJob.URL=
UploadJob.UploadPosts=
UploadJob.UploadJobPostName=
Proxy=0
Proxy.Host=


Gruß,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
recall Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: Mi 06.07.05 19:13 
hehe, die einfachsten Fehler sind oft die dümmsten :?: :roll:
ich habe localhost:631/printers/default? und nicht http://localhost:631/printers/default? geschrieben, wie
es Windoof von mir erwartet hätte :roll:

OK Danke nochmal, jetzt klappt alles !
Muratxiv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: Fr 26.12.08 20:49 
Hui, da hat einer vor 3,5 Jahren schon meine Frage gestellt...

Sry, dass ich es nochmal ausgrabe, aber sonst kommt ja sowas wie "benutz bitte die Suchfunktion" ;-)
Ich hoffe ihr seid mir nicht böse deswegen.


Es ist so, dass ich mit einem Freund aus Fischertechnik eine Fräse gebaut habe. Diese lässt sich auch schon mit einem schönen, selbst geschriebenen Delphi Programm ansteuern.
Jetzt würde ich nur gerne die Platinen, die z.B. mit SprintLayout erstellt werden direkt drucken/fräsen. Also habe ich mir gedacht, wäre es am besten, wenn man einen viruellen Drucker hätte, der von Windows verwaltet wird, und dann die Daten an ein (durch den Druckbefehl gestartetes) Programm schickt, dass dann die Fräse ansteuert.
Ist es möglich, wie oben beschrieben, ein Delphi Programm zu schreiben, dass die Daten durch Drucken bekommt, ohne dass das Programm vorher schon läuft, sondern erst durch drucken gestartet wird?
Wenn ja, wie?

Dankeschön ;-)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 26.12.08 21:32 

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Muratxiv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: Sa 27.12.08 19:49 
Redmon installiert und Druckertreiber von da: www.adobe.com/suppor...etail.jsp?ftpID=1502

Mein eigenes Programm wird bereits (beim Drucken) aufgerufen. Folgendes kann ich auch schon auslesen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
TEMP := GetEnvironmentVariable('TEMP');
    REDMON_USER := GetEnvironmentVariable('REDMON_USER');
    REDMON_DOCNAME := GetEnvironmentVariable('REDMON_DOCNAME');
    REDMON_JOB := GetEnvironmentVariable('REDMON_JOB');
    REDMON_MACHINE := GetEnvironmentVariable('REDMON_MACHINE');
    REDMON_PRINTER := GetEnvironmentVariable('REDMON_PRINTER');
    REDMON_PORT := GetEnvironmentVariable('REDMON_PORT');
    REDMON_FILENAME :=GetEnvironmentVariable('REDMON_FILENAME');
    REDMON_SESSIONID :=GetEnvironmentVariable('REDMON_SESSIONID');


Nur wie komme ich jetzt an die Druckdaten? Kann ich die dann noch in ein TImage laden, um anzuzeigen, was gerade gefräst wird?

Habe schon gesucht und iwas mit stdinput gefunden, aber leider nicht genauer. Könnte mir bitte nochmal jemand helfen ;-)

Danke ;-)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 27.12.08 19:59 
Glaub die Daten kannst Du von der Standardeingabe lesen. Das ist das, was sonst direkt an den Drucker gehen würde ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Muratxiv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: So 28.12.08 18:04 
Hmmm - klappt noch nicht 100%...

So werte ich das Ergebnis aus (in Formcreate):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    if ParamCount <> 1 then exit;
  //Input ist schon offen, also brauchen wir es nicht zuzuweisen
  SetLineBreakStyle(Input, tlbsLF); // weil sonst 0D auf Windows zu 0D0A ersetzt wird
  while not eof(Input) do begin
    read(Input, s);
    memo2.lines.Add(s);
    Reset(Input);
  end;


Wenn ich von Notepad aus "123" drucken will erscheint folgendes im Memo:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
%!PS-Adobe-3.0
m
%%DocumentSuppliedResources: (atend)
%%LanguageLevel: 2
ults
g def/setpacking where{pop false
if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch
ineto tx 0
ch moveto 0 -10 rmoveto}def/=={/cp 0 def
print{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp
)tprint}readonly def
atortype{(--)tprint =string cvs tprint(-- )tprint}
nary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def
p(-savelevel- )
eadonly def/stringtype{dup rcheck{(\()tprint
dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(])
y def/packedarraytype{dup
pop(-packedarray- )tprint}ifelse}readonly def/courier
egin
page}if initgraphics courier setfont
restore 2 vmreclaim}if vmstatus exch pop exch pop PrtVMMsg}{
oad prnt
et exec(%%[ Error: )print errorname
stemdict put dup 4 $brkpage put bind readonly put/currentpacking
Resource
talErrorIf{{initgraphics findfont 1 index 0 eq{exch pop}{dup
ng
tfont counttomark 3 div
ns binary data, but your printer requires a)100 500
eturn to the driver's property sheets, turn off the use of)100 470
@)0 get 64 eq
er, als auf diesem Drucker vorhanden ist. )
en Sie dann erneut:)
daß auf der Registerkarte "Geräteeinstellungen" die Angabe für "Verfügbarer Postscript-Speicher" korrekt ist.)
en Sie die Anzahl der im Dokument verwendeten Schriftarten. )
15 425 12
/VM?{pop}bind def}{/VM? userdict/PrtVMMsg
def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^
d/M/moveto , d/-
rc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C
-M
setdash , d/S/show , d/LH/showpage
el 2 ge{pop true}if}if d L2?{/xS/xshow , d/yS/yshow , d/zS/xyshow ,
n/bind ld/lw/Lw ld
x setmatrix[/TextInit/GraphInit/UtilsInit
/Pscript_Win_Data where{!}{U/Pscript_Win_Data & put}?/ADO_mxRot ~
 dict @ ` put
 , d/resume{` Pscript_Win_Data `}b U `
 @ lucas eq{! exit}if}loop countdictstack ~ sub @ 0 gt{{E}repeat}
und 0.25 add ~
{1}{-1}?}?}?}b/nonzero_dsnap{dtransform
}b/irp{4 -2 $ + +S fx 4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b/rp{4 2 $ M 1 ^ 0
ve put}if U/DefIf_bool
finefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b
t
 0 1 255{1 ^ ~/.notdef put}for d
@/XUID eq ~/UIDBase eq or or{! !}{d}?}forall/CDevProc ~ d/Metrics2
 ![~]composefont !}
 @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge
snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F
y d/colspABC/DeviceRGB d
olorRendering/ProcSet resourcestatus{! ! T}{F}?}{F}?
{
one}if}{!/none}?}bn
ltColorRendering*){cvn exit}127 string
! !}?}if/buildcrdname{/ColorRendering/ProcSet findresource `
ne}if(.)
 5{~ 1 ^ cvs length 1 ^ length 1 ^ sub
ering defineresource !}b/findcolorrendering where{!}{

ndresource
nfo get/GlyphNames2HostCode get `}bind d
s2Unicode 16 dict d/GlyphNames2HostCode 16 dict d}bind d
 get ` d
]%%)= flush end
PDFeature: JobTimeout 0
params}{statusdict/setjobtimeout get exec}ifelse
itTimeout 300
atusdict/waittimeout 3 -1 roll put}ifelse

ebegin{
6…
 819
geSetup
 file Pscript_T3Hdr 5.0 0
6andT32? exch def/T32DefSBCMap{/CIDInit/ProcSet
istry(Adobe)def/Ordering(Identity1)def/Supplement 0 def end def/CMapType 0
spacerange 1 begincidrange
andT32?{T32DefSBCMap}def/T32RsrcBegin{Is2016andT32?{
dT32?
findfont dup 5 2 roll 1 index
-1 roll/CharProcs get 3 1 roll put dup/Encoding get 5 -1 roll
andT32?{
xch pop exch pop/CIDFontType 4 def
pop pop}{T32DefSBCMap}ifelse 5 -1 roll[exch]composefont dup
t end
ntT3{11 dict begin pop/FontType 3 def
s/.notdef{}put/Metrics 257 dict def Metrics/.notdef 3 -1 roll put
t begin/char exch
tdef get aload pop}ifelse setcachedevice begin
xec end}def currentdict end definefont pop}bind def/GreNewFont{Is2016andT32?
Is2016andT32?{/BitmapFontInit
font end}{pop UDF}ifelse}bind def
ch /.notdef put} for 
2 0 ] 
ðÀðÀðÀðÀðÀðÀðÀðÀðÀðÀðÀðÀðÀ)
2 ]  0 0]
ddT3T32Char
x
 26 true [1 0 0 1 -3 26 ]  0 0]
00 AddT3T32Char
/Pscript_Windows_Font & d/TextInitialised? T d
th add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets
 get/Encoding ~ 3 ^/0 eq{&
7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{
 get
 FDV 2 copy get @ length array copy
t_Windows_Font 3 1 $ put}b/sLT{: Lw -M currentpoint snap M 0 - 0
/sW null d/sSU{N
0 M}b/sRxy{: matrix astore concat 0 0 M}b/eR/; , d
tchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d/OrigFontStyle ~ d
nt
 Encoding ~ get ~ d}for & E
e 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 add 255
/FDepVector
th 1 add string}{100 lt{FontName length 2
erval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ putinterval cvn 1 ^
r 3 1 $ put}for & @ E
$ neg put 5 0 put 90 matrix R matrix concatmatrix
dfont 1 ^ ~ definefont Pscript_Windows_Font 3 1 $ put}b/UmF{L2?
r get{/FontName
F0 [‹
0 24 0 ] 

[25 0 5 -30 21 1 ] 
)
26 true [1 0 0 1 -3 26 ]  0 0]
0 AddT3T32Char
ð
)
%BoundingBox: 18 23 577 819
5.0 0
ocset Pscript_T3Hdr 5.0 0
1


Wenn ich das als .ps abspeichere und in PDF umwandeln lasse, erscheint nur eine weiße Seite.

Wie schaffe ich es, erstmal überhaupt die Datei zu bekommen und dann diese noch in ein TImage zu laden?

(Im Anhang Bilder von den Druckereinstellungen)

Zitat:

user defined image
img1.jpg

user defined image
img2.jpg

user defined image
img3.jpg
Einloggen, um Attachments anzusehen!
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: So 28.12.08 20:40 
user profile iconMuratxiv hat folgendes geschrieben Zum zitierten Posting springen:
Hmmm - klappt noch nicht 100%...

Wenn ich von Notepad aus "123" drucken will erscheint folgendes im Memo:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
%!PS-Adobe-3.0
m
%%DocumentSuppliedResources: (atend)
%%LanguageLevel: 2
ults
g def/setpacking where{pop false
if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch
ineto tx 0
ch moveto 0 -10 rmoveto}def/=={/cp 0 def
print{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp
)tprint}readonly def
atortype{(--)tprint =string cvs tprint(-- )tprint}
nary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def
p(-savelevel- )
eadonly def/stringtype{dup rcheck{(\()tprint



Das angebliche Postscript ist stark verstümmelt, jedenfalls an den Zeilenanfängen - die letzte Zeile heisst sicher readonly usw.

Gruss Reinhard
Muratxiv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: Mo 29.12.08 17:28 
Habe ich mir auch schon gedacht. Die Frage ist nur, woran dies liegt...

Ich vermute ja, da stimmt iwas mit meinem Programm nicht, also dass der Stream nicht richtig ausgewertet wird :-(


Leider habe ich keine Ahnung was nicht stimmt - das entscheidende aus meinem Programm habe ich ja oben schon gepostet...
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 29.12.08 18:00 
Versuch mal einen THandleStream und übergeb dem das Handle vom StdInput. Das bekommst Du aus dem StartupInformation-Block über die WinAPI.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Muratxiv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 27



BeitragVerfasst: Di 30.12.08 14:49 
So, jetzt wird gar kein Stream mehr abgegriffen. Könnte mir jemand sagen, was falsch an meinem Programm ist und eine korrigierte Version posten?

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
procedure TForm1.FormCreate(Sender: TObject);
  var TEMP,
  REDMON_USER,
  REDMON_DOCNAME,
  REDMON_JOB,
  REDMON_MACHINE,
  REDMON_PRINTER,
  REDMON_PORT,
  REDMON_FILENAME,
  REDMON_SESSIONID: string;
  Stream: THandleStream;
begin
  TEMP := GetEnvironmentVariable('TEMP');
    REDMON_USER := GetEnvironmentVariable('REDMON_USER');
    REDMON_DOCNAME := GetEnvironmentVariable('REDMON_DOCNAME');
    REDMON_JOB := GetEnvironmentVariable('REDMON_JOB');
    REDMON_MACHINE := GetEnvironmentVariable('REDMON_MACHINE');
    REDMON_PRINTER := GetEnvironmentVariable('REDMON_PRINTER');
    REDMON_PORT := GetEnvironmentVariable('REDMON_PORT');
    REDMON_FILENAME :=GetEnvironmentVariable('REDMON_FILENAME');
    REDMON_SESSIONID :=GetEnvironmentVariable('REDMON_SESSIONID');
    Memo1.Lines.add(inttostr(ParamCount));
    Memo1.Lines.Add(Temp);
    Memo1.Lines.Add(REDMON_USER);
    Memo1.Lines.Add(REDMON_DOCNAME);
    Memo1.Lines.Add(REDMON_JOB);
    Memo1.Lines.Add(REDMON_MACHINE);
    Memo1.Lines.Add(REDMON_PRINTER);
    Memo1.Lines.Add(REDMON_PORT);
    Memo1.Lines.Add(REDMON_FILENAME);
    Memo1.Lines.Add(REDMON_SESSIONID);

  Stream := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
  memo2.Lines.LoadFromStream(stream);
  stream.Free;
end;



memo2 bleibt leider leer, wenn ich den Drucker auf das Programm verweise und drucke :-(
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.12.08 14:54 
Also ich weiß zwar nicht wie das läuft, aber ich vermute doch, dass man die Daten der Reihe nach übergeben bekommt, das merkt man ja auch, wenn z.B. ein Vorschauprogramm zuerst nur die erste Seite empfängt und dann den Rest langsam dazubekommt.

Müsste die Eingabe nicht mit Pipes verarbeitet werden können? Also ReadFile angewendet, bis False zurückgegeben wird?

// EDIT:
Wie das genau aussieht, weiß ich allerdings nicht. Also ob man vorher CreatePipe mit dem Handle benutzen muss oder so. :nixweiss:
Da müsste ich auch erst mir das mal anschauen.
Aber vielleicht kann dazu ja auch jemand direkt etwas sagen. :D