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 |