Frage zu GetPrinter()



  • Hallo,

    ich versuche gerade in Visual C++ 2008 mittels WinAPI den Druckernamen zu ermitteln, den ich per printdlg() ausgewählt habe.

    Daher wollte ich zunächst mittels GetPrinter() den Speicherbedarf für die Struktur PRINT_INFO_2 ermitteln und anschließend die Struktur füllen. Irgendwie klappt aber schon das Ermitteln der Größe nicht so richtig:

    DWORD *Needed=NULL; 
    hPrinterDC=print.hDC;
    GetPrinter(hPrinterDC, 2, NULL, NULL, Needed);
    

    Das Handle hPrinterDC(und somit auch die Struktur print) scheint in Ordnung zu sein, denn ich frage direkt danach im Code mittels GetDeviceCaps() und hPrinterDC einige Druckerparameter ab und erhalte augenscheinlich korrekte Ergebnisse.

    Kann mir jemand sagen, was ich falsch mache?



  • Du musst auch Speicer zur Vefügung stellen, wo der Bedarf reingeschrieben werden soll!

    DWORD dwNeeded; 
    GetPrinter(hPrinterDC, 2, NULL, NULL, &dwNeeded);
    


  • Hmmm....irgendwie klappt das nicht!

    PRINTDLG print;
    print.lStructSize = sizeof(PRINTDLG);
    print.hwndOwner = hWnd;
    print.hDevMode = NULL;
    print.hDevNames = NULL;
    print.hDC = NULL;
    print.Flags = PD_ALLPAGES | PD_COLLATE | PD_RETURNDC | PD_NOSELECTION;
    print.nFromPage = 0;
    print.nToPage = 0;
    print.nMinPage = 0;
    print.nMaxPage = 0;
    print.nCopies = 1;
    print.hInstance = NULL;
    print.lCustData = 0L;
    print.lpfnPrintHook = NULL;
    print.lpfnSetupHook = NULL;
    print.lpPrintTemplateName = NULL;
    print.lpSetupTemplateName = NULL;
    print.hPrintTemplate = NULL;
    print.hSetupTemplate = NULL;
    
    bool Ergebnis;
    DWORD Fehler;
    DWORD dwNeeded;
    PrintDlg(&print);
    HDC hPrinterDC;
    hPrinterDC=print.hDC;
    Ergebnis=GetPrinter(hPrinterDC, 2, NULL, NULL, &dwNeeded);
    if (Ergebnis==false) Fehler=GetLastError();
    

    Als Ergebnis bekomme ich false, in dwNeeded steht immer noch 0xcccccccc und als letzten Fehler erhalte ich 0x00000006 (Invalid Handle?).

    Wie kann das Handle ungültig sein, wenn das selbe Handle direkt danach mit GetDeviceCaps() wunderbar funktioniert?



  • Hallo,

    Wie kann das Handle ungültig sein, wenn das selbe Handle direkt danach mit GetDeviceCaps() wunderbar funktioniert?

    Weil der Handle-Typ, den GetPrinter erwartet, ein anderer ist, als der, welcher von PrintDlg zurück gegeben wird. Mit OpenHandle erhält man ein geeignetes, wie auch hier:

    http://msdn.microsoft.com/en-us/library/dd144911(VS.85).aspx

    zu lesen ist.

    MfG,

    Probe-Nutzer


Log in to reply