MASM32-SDK (Dateizugriffe bei Windows Konsolapplikationen):
Die API ShellExecute als praktischer Ansatz für das Drucken unter Windows

Es scheint gar nicht einfach zu sein, aus einem mittels MASM32 geschriebenen Programm heraus eine Ausgabe auf den Drucker zu bringen. Die beim MASM32-SDK mitgelieferten Dokumentation erwähnt das Thema nicht. Und auch per Google & Co. ist nichts zu finden.

Immerhin hat der beim MASM32-SDK mitgelieferte Editor ein Icon mit einem Druckersymbol. Betätigt man es, so öffnet sich das von Windows gewohnte Druckdialogfenster. Man kann auch hier den Knopf für Drucken betätigen, aber mein Drucker reagiert nicht drauf. Schade auch!

Eine mögliche Lösung versteckt sich in dem Beispiel unter masm32/examples/examp02/shellex. Die API (Application Program Interface, Anwendungsprogrammschnittstelle) „ShellExecute” bietet eine Option zur Druckausgabe eine Datei an. Sie funktioniert, wenn für den zu druckenden Dateityp ein passender Eintrag in der Registry vorhanden ist. Die Druckausgabe erfolgt dann ohne Anzeige des Druckdialogfensters sofort.

Häufig ist es zweckmäßiger, das Druckdialogfenster vor dem Druckvorgang anzuzeigen. Auch das ist mit dem API „ShellExecute” möglich.


Ubrigens, invoke ShellExecute,0,NULL,ADDR para,NULL,NULL,SW_SHOW in Verbindung mit der Angabe von para db "C:\mp3\Peter_Alexander\14 - Bambina.mp3",0 lässt bei meinem Laptop einen Top-Hit aus den 1950ern aus dem Laptop erschallen.

Der Trick ist dabei, dass anstelle von ADDR open oder ADDR print der Eintrag NULL steht. Windows sucht dann die passende Applikation zum Öffnen der angegebenen Datei selbstständig. Aber das kann man auch erreichen, wenn man die Datei im Explorer doppelt anklickt!

In der fünften Zeile des unterhalb gezeigten Quellprogramms steht ein Link zur US-englischsprachigen Beschreibung der API.

Testprogrammvorlage für die API ShellExecute
;------------------------
; Modifiziert aus masm32/examples/examp02/shellex
;
;Der Aufruf der API ShellExecute ist beschrieben in
; docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-shellexecutea
;(Abruf 3.2.2019)
;;------------------------

      .386
      .model flat, stdcall  ; 32 bit memory model
      option casemap :none  ; case sensitive

      include \MASM32\INCLUDE\windows.inc
      include \MASM32\INCLUDE\kernel32.inc
      include \MASM32\INCLUDE\shell32.inc
      include \MASM32\INCLUDE\masm32.inc

      includelib \MASM32\LIB\kernel32.lib
      includelib \MASM32\LIB\shell32.lib
      includelib \MASM32\LIB\masm32.lib

;------------------------
; Die Kommentarsemikolons sind so gesetzt, dass die Datei c:\temp\api.txt sofort
; ohne Druckerdialog auf dem Standarddrucker gedruckt wird.
;------------------------
.data
print   db  "print",0
open    db  "open",0
;pgm    db   "C:\Program Files (x86)\OpenOffice 4\program\soffice.exe",0
;para   db   "d:\daten\123\aktien16.xls",0
;para   db   "d:\daten\word\Patric41.rtf",0
;para   db    "C:\mp3\Peter_Alexander\14 - Bambina.mp3",0

;pgm    db   "c:\pgm\notepad++\notepad++.exe",0
para   db   "c:\temp\api.txt",0

.code
start:
;       invoke ShellExecute,0,ADDR open,ADDR pgm,ADDR para,NULL,SW_SHOW     ;mit open
        invoke ShellExecute,0,ADDR print,ADDR para,NULL,NULL,SW_SHOW
;       invoke ShellExecute,0,NULL,ADDR para,NULL,NULL,SW_SHOW

        invoke ExitProcess,eax

end start
Letztes Upload: 24.03.2023 um 11:35:16 • Impressum und Datenschutzerklärung