PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Win32, Drucker: Duplex systemweit setzen



Thomas Engelke
13-01-2006, 07:31
Hallo!

Unter Win32 suche ich eine Möglichkeit, Duplexdruck für einen Drucker zu aktivieren. Dies funktioniert ungefähr so:



#include <stdio.h>
#include <windows.h>

#define PRINTERNAME "\\\\servername\\printername"

PDEVMODE pDevMode;

int Cleanup(HANDLE hPrinter) {
if(!ClosePrinter(hPrinter)) {
printf("Failed to return memory for allocated printer device. Reboot.\n");
return -1;
};
free(pDevMode);
system("PAUSE");
return 0;
};

int main(int argc, char *argv[]) {

HANDLE hPrinter;

if ( OpenPrinter ( PRINTERNAME, &hPrinter, 0 ) == 0 ) {
printf("Error opening Printer %s.\n", PRINTERNAME);
system("PAUSE");
return -1;
};

int len=DocumentProperties(0,hPrinter,0,0,0,0);

if (!len) {
printf ("Failed to set len.\n");
return Cleanup(hPrinter);
};

if(!(pDevMode=(PDEVMODE)malloc(len))) {
printf("Failed to allocate %d byte for pDevMode.\n", len);
return Cleanup(hPrinter);
};

if(DocumentProperties (0, hPrinter, 0, pDevMode, 0, DM_OUT_BUFFER )==0) {
printf("Failed DocumentProperties for Output.\n");
return Cleanup(hPrinter);
};

if(pDevMode->dmFields & DM_DUPLEX) {
pDevMode->dmDuplex=DMDUP_HORIZONTAL;
} else {
printf("Drucker unterstützt kein Duplex.\n");
Cleanup(hPrinter);
};

if(DocumentProperties (0, hPrinter, 0, pDevMode, pDevMode, DM_OUT_BUFFER )==0) {
printf("Failed to get DocuProps a 2nd time to check for duplex.\n");
Cleanup(hPrinter);
};

if(!(pDevMode->dmFields & DM_DUPLEX)) {
printf("Duplex doesn't seem to be set, even after setting it to the printer.\n");
Cleanup(hPrinter);
};

if(!DocumentProperties(0, hPrinter, 0, pDevMode, pDevMode, DM_IN_BUFFER|DM_OUT_BUFFER)) {
printf("Failed to set duplex.\n");
return Cleanup(hPrinter);
} ;

return Cleanup(hPrinter);
}


Diese Variante funktioniert ziemlich gut. Der Drucker scheint Duplex zu unterstützen und es auch korrekt zu setzen. Leider gibt es bei dieser Variante ein Problem: Das Setzen von Duplex ist nicht systemweit. Es beschränkt sich auf den aktuellen Task.

Führt man jetzt eine Applikation (mittels beispielsweise ShellExecute()) aus und läßt diese NICHT als Tochter des aktuellen Tasks, sondern als Tochter von Explorer (so daß die Applikation während der Ausführung weiterlaufen kann) aus, werden natürlich die Settings von Explorer "geerbt", so daß Duplex dort wieder nicht aktiv ist.

Wir haben bisher nur die Möglichkeit gefunden, die Registry zu ändern. Darin befindet sich eine ähnliche Struktur wie DEVMODE, die sich allerdings in ein paar entscheidenden Punkten unterscheidet, so daß wir dort wieder nicht sicher sein können, welches Bit Duplex systemweit vorinitialisiert.

Hat jemand dazu eine zündende Idee?

SeeksTheMoon
16-01-2006, 08:44
Eigenschaften die der Drucker annehmen soll sind immer nur für den aktuellen Druck-Job. Wenn der Drucker das behalten soll, dann muss das im Treiber oder am Drucker selber eingestellt werden.