Von StarMicronics habe ich einen Zusatz zum Druckertreiber für einen Bon-Drucker (mit seriellem Interface) erhalten, mit dem man den Drucker-Status (Online? Papier alle? Deckel zu?) abfragen können soll. Mit einem mitgelieferten Demo-Beispiel in VB geht das auch. Aber ich muss den Aufruf aus dem HTML einer Webseite mit VBScript machen, und das kriege ich nicht hin. Ich wäre sehr dankbar (bis zum 17.02.2006 nicht nur mit Worten, sondern mit echten 100 Euro für die erste funktionierende Lösung als Dankeschön!), wenn mir jemand einen Tipp gibt. Also hier die Details:
Das Objekt habe ich mit der ID "StarSerial" und der ClassId definiert. Das Objekt hat diverse Methoden, u. a. auch StarPrinterIsOnline und StarGetPrinterStatus. Diesen müssen jeweils zwei Werte übergeben werden, die Portnummer und die Baudrate.
Der Online-Check wird sauber ausgeführt, aber der Status-Check bringt immer Fehler.
Die Methode zum Online-Check liefert einen boolean Rückgabewert, die Methode zum Status-Check liefert hingegen einen Rückgabewert, der mit dem "Public Type" PrinterStatus (vermutlich im ocx-Objekt) typisiert sein soll. "Type Member" sind u. a. angegeben als:
- StatusVersion As Integer
- Online As Boolean
- CoverOpen as Boolean
- PaperLow as Boolean
Jetzt suche ich eine Codierung in VBScript, mit der ich an die Member-Werte ran komme.
Hier ist der Code, der immer zum Fehler "Object required" führt, und wo ich skizziert habe, wie ich mir die Verarbeitung gedacht hatte:
<HTML>
<HEAD>
<TITLE>Druckerstatus abfragen</TITLE>
</HEAD>
<object classid="CLSID:BDB1A3EE-D03A-46F4-8EEB-2498E7684D23"
id=StarSerial>
</object>
<SCRIPT LANGUAGE=VBScript>
Sub GmBon
' ------------------------------------------------------------
' Drucker online? Erst weiter, wenn OK:
DO
IF StarSerial.StarPrinterIsOnline("COM1:", 9600) THEN
MsgBox "ONLINE"
EXIT DO
ELSE
MsgBox "OFFLINE"
END IF
LOOP
' ------------------------------------------------------------
' Deckel zu? Erst weiter, wenn OK:
DIM Status
SET Status = StarSerial.StarGetPrinterStatus("COM1:", 9600)
' DIM CoverOpen
' SET CoverOpen = Status.CoverOpen
' If CoverOpen THEN
' MsgBox "THEN"
' ELSE
' MsgBox "ELSE"
' END IF
End Sub
</script>
<BODY onLoad="VBScript:GmBon">
<PRE>
Das ist der Bon
Dankeschön - Auf Wiedersehn
0000021378 13.02.2006 - 17:35:42 001
</PRE>
</body>
</html>
Hier ist auch noch ein VB-Coding aus dem Demo-Programm als Anhaltspunkt für eine Lösung, die so leider in VBScript nicht zu machen ist:
Private Sub DisplayStatus(headline As String)
Dim feedback As String
Dim status As PrinterStatus
feedback = headline + vbCrLf + vbCrLf
status = Me.StarSerial1.StarGetPrinterStatus(Me.textPort.Text, CLng(Me.textBaud.Text))
If status.Error_UnableToOpenSerialPort Then
feedback = feedback + " Unable To Open Serial Port!"
ElseIf status.Error_Timeout Then
feedback = feedback + " Timeout retreiving status!"
Else
feedback = feedback + " Online: " + CStr(status.Online) + vbCrLf
feedback = feedback + " Cover: " + IIf(status.CoverOpen, "Open", "Closed") + vbCrLf
feedback = feedback + " Paper: " + IIf(status.Error_OutOfPaper, "Empty", IIf(status.PaperLow, "Low", "Loaded")) + vbCrLf
feedback = feedback + " Non-recoverable error: " + CStr(status.Error_NonRecoverable) + vbCrLf
feedback = feedback + " Auto-cutter error: " + CStr(status.Error_AutoCutter) + vbCrLf
feedback = feedback + " Mechanical error: " + CStr(status.Error_Mechanical) + vbCrLf
End If
MsgBox feedback, vbOKOnly + vbInformation, "Printer Status"
End Sub