2009-04-10 11 views
3

Ich habe eine VB6-Anwendung, die den Fehler 5 "Ungültiger Prozeduraufruf oder ungültiges Argument" gibt, wenn das Programm versucht, das Printer-Objekt auf einen bestimmten Drucker aus der Printers-Auflistung festzulegen . Bei dem fraglichen Drucker handelt es sich um eine Art Kopierer/Drucker, der über einen Druckserver läuft. Der Fehler tritt nicht auf, wenn das Printer-Objekt auf andere in der Sammlung definierte Drucker festgelegt wird. Irgendwelche Ideen, was den Fehler 5 in diesem Fall verursachen könnte? Ich bin mir nicht sicher, was genau passiert, wenn ich die Anweisung "Set Printer = x" in VB6 verwende - versuche ich zu diesem Zeitpunkt mit dem eigentlichen Druckertreiber zu interagieren? Ist es möglich, dass der Treiber vom VB6-Druckerobjekt aus irgendeinem Grund nicht als gültiger Drucker erkannt wird, was zu dem Fehler "ungültiges Argument" führt?"Ungültiger Prozeduraufruf oder Argument" beim Festlegen des Druckerobjekts

+0

Sind Sie sicher, dass der Fehler in der Zeile "Drucker einstellen" liegt?Ich habe Fehler bei der Einstellung verschiedener Eigenschaften festgestellt, die nicht auf einen bestimmten Drucker zutreffen. Aber nicht am Set. –

+0

Ja, es ist richtig in der Zeile "Drucker einstellen". Die Quelle ist zeilennummeriert, und der Error-Handler zeigt den Erl-Wert als Teil der Fehlermeldung an. –

Antwort

3

Der „ungültige Prozedur-Aufruf oder Argument“ ist für einen VB-Laufzeitfehler 5.

Ich vermute, dass der Fehler 5 Sie sehen, der Fehlercode Win32 ist, das bedeutet „Zugriff verweigert“.

Scheinbar VB Laufzeitfehler unterscheiden sich von Win32-Fehler - ich vermute, dass es mit den Wurzeln von VB vor MS-DOS vorgeht: http://blogs.msdn.com/ericlippert/archive/2004/09/09/227461.aspx. Ich bin nicht sicher, wie Sie bestimmen sollten, welche Interpretation zu verwenden, wenn

+0

Ahh ... dachte nie darüber nach. Der betreffende Drucker befindet sich auf einem Druckserver, aber der Benutzer kann mit anderen Anwendungen darauf drucken. Was könnte dazu führen, dass VB6 "Zugriff verweigert" erhält, wenn "Drucker einstellen = x" gewählt wird? Muss das Druckerobjekt einige Konfigurationsrechte für den Zieldrucker oder etwas anderes haben? –

+0

Wenn der Benutzer außerhalb des Programms auf den Drucker zugreifen kann, bin ich weniger geneigt zu denken, dass es sich um ein Problem mit Zugriffsverweigerung handeln könnte. –

+1

Der Fehler 5 ist fast sicher der VB-Laufzeitfehler 5 "Ungültiger Prozeduraufruf oder Argument". Sie erhalten keinen Win32-Fehler beim Ausführen einer 'Set'-Anweisung. Sie erhalten nur Win32-Fehler von VB6, wenn Sie API-Aufrufe mit der 'Declare'-Anweisung machen, und dann müssen Sie sie erkennen, indem Sie auf die 'Err.LastDllError'-Eigenschaft schauen. – MarkJ

2

Sie verwenden Code wie folgt, um es richtig einzustellen? Nicht nur versuchen, es an einer Zeichenfolge festzulegen?

Dim strDeviceName As String 
    Dim prnCurrent As Printer 

    For Each prnCurrent In Printers 

     If UCase$(prnCurrent.DeviceName) = strDeviceName Then 

     Set Printer = prnCurrent 

     Exit For 

     End If 

    Next prnCurrent 

Um den Standarddrucker nicht mehr zu ändern, führen Sie diesen Code vor dem Einrichten des Druckers aus. Dann müssen Sie den Standarddrucker nicht zurücksetzen. Dies macht auch Ihre Druckerauswahl einzigartig für Ihr Programm, was die meisten Leute wollen.

' deassociate printer object from default system printer 
Printer.TrackDefault = False 
+0

Ja, die App setzt das Printer-Objekt auf ein Printer-Objekt Druckersammlung. Es setzt den Drucker auf einen Belegdrucker, druckt den Beleg und setzt den Drucker wieder auf den Win-Standarddrucker. Wenn das der Kopierer ist, tritt der Fehler auf. Wenn der Standarddrucker nicht der Kopierer ist, tritt kein Fehler auf. –

+0

sehe meine überarbeitete Antwort - mit Printer.TrackDefault = False, um zu vermeiden, den Standarddrucker zu ändern und damit zu vermeiden, dass er zurückgesetzt werden muss. –

0

Sie können einen Blick auf die folgende Seite nehmen wollen:

http://support.microsoft.com/kb/322710

Jedes Mal, wenn in VB6 Druck ich immer verwenden dieses Dialogfeld anstelle des gemeinsamen Dialogfeld, das mit VB6 kommt. Es ist viel zuverlässiger.

1

Ich habe dieses Problem in MS Access 2007 VBA gelöst, indem Sie den Servernamen zusammen mit dem Druckernamen einschließen.

Application.Printer = Application.Printers("\\servername\printername") 

statt

Application.Printer = Application.Printers("printername") 

Hoffnung hilft dies jemand anderes.

1

Ich bekam diesen Fehler und nach ein paar Stunden der Frustration fand meine Antwort. Es handelte sich um ein Problem, bei dem die Groß-/Ich hatte ein Capital "S", als ich einen Kleinbuchstaben "s" hätte haben sollen. So

wenn sah der Code wie folgt:

XeroxReport = "\\Share\Red Xerox 430" 
Set Application.Printer = Application.Printers(XeroxReport) 

Ich würde erhalten Fehler 5

Aber wenn ich es geändert:

XeroxReport = "\\share\Red Xerox 430" 
Set Application.Printer = Application.Printers(XeroxReport) 

presto arbeitete es

Verwandte Themen