Windows <b class="rk">Standarddrucker</b> finden



  • Hi Leute,

    wie bekomme ich ein Handle auf den Standarddrucker von Windows? Das einzige was ich bis jetzt irgendwie dazu gefunden habe ist GetPrinter(...) doch irgendwie versteh ich die Syntax nicht ganz.



  • Hmm... also im Petzold steht nix von GetPrinter. Versuch mal EnumPrinters.

    MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_9fjn.asp

    cu



  • So, hab das ganze aus dem Petzold mal abgetippt:

    HDC GetPrinterDC()
    {
        DWORD dwNeeded,dwReturned;
        HDC hdc;
        PRINTER_INFO_4 *pinfo4;
        PRINTER_INFO_5 *pinfo5;
    
        if(GetVersion() & 0x80000000)
        {
            // Windows 98
            EnumPrinters(PRINTER_ENUM_DEFAULT,NULL,5,NULL,0,&dwNeeded,&dwReturned);
    
            pinfo5 = malloc(dwNeeded);
            EnumPrinters(PRINTER_ENUM_DEFAULT,NULL,5,(PBYTE) pinfo5,dwNeeded,&dwNeeded,&dwReturned);
    
            hdc = CreateDC(NULL,pinfo5->pPrinterName,0,0);
            free(pinfo5);
        }
        else
        {
            // Windows NT
            EnumPrinters(PRINTER_ENUM_LOCAL,NULL,4,NULL,0,&dwNeeded,&dwReturned);
            pinfo4 = malloc(dwNeeded);
            EnumPrinters(PRINTER_ENUM_LOCAL,NULL,4,(PBYTE) pinfo4,dwNeeded,&dwNeeded,&dwReturned);
    
            hdc = CreateDC(NULL,pinfo4->pPrinterName,NULL,NULL);
            free(pinfo4);
        }
    
        return hdc;
    }
    

    So, das steht im Petzold. Wenn du noch Probleme hast, kannst du dir auch mal den Quellcode von graph++ (www.magiccreating.de.vu) anschauen, da hab ich auch ne Druckfunktion eingebaut.

    Bist du eigentlich der TheShadow von www.blitzbase.de? Wenn ja: Schön dich mal wieder zu sehen :)!

    cu

    [ Dieser Beitrag wurde am 10.12.2002 um 17:04 Uhr von MagiC Creator editiert. ]



  • Hi Leute,

    danke für die Antworten nun zum Thema. 🕶
    @MagiC Creator: Nö ich war noch nie auf "blitzbase" . 😕 Mein eigentlicher Nick ist "Shadow" 🕶 doch der war hier leider schon vergeben so hab ich einfac TheShadow draus gemacht. 😉
    der Quelltext vom Petzold ist interessant aber wohl fehlerhaft. Das malloc kann ja so wie es dort drin steht nich funzen ich hab es mal wie folgt geändert:

    if(GetVersion() & 0x80000000)   
        {                               
            EnumPrinters(PRINTER_ENUM_DEFAULT,NULL,5,NULL,0,&dwNeeded,&dwReturned);
            pinfo5 =  (PRINTER_INFO_5 *)malloc(sizeof(dwNeeded));
            EnumPrinters(PRINTER_ENUM_DEFAULT,NULL,5,(PBYTE) pinfo5,dwNeeded,&dwNeeded,&dwReturned);
            pdc = CreateDC(NULL,pinfo5->pPrinterName,0,0);
            free(pinfo5);
        }
        else
        {                               
            EnumPrinters(PRINTER_ENUM_LOCAL,NULL,4,NULL,0,&dwNeeded,&dwReturned);
            pinfo4 = (PRINTER_INFO_4 *) malloc(sizeof(dwNeeded));
            EnumPrinters(PRINTER_ENUM_LOCAL,NULL,4,(PBYTE) pinfo4,dwNeeded,&dwNeeded,&dwReturned);
            pdc = CreateDC(NULL,pinfo4->pPrinterName,NULL,NULL);
            free(pinfo4);
        }
    

    leider raucht mir nun der Code bei free(..) ab. Des weiteren hab ich festgestellt das mir der falsche Printer ausgewählt wird. Ich werde mal sehen was ich mit den Grundlagen machen kann. Wichtig war ja eigentlich zu wissen wie es funzen sollte die Feinarbeit bekomme ich schon irgendwie hin. Ich werde mir auch nochmal deinen Quelltext anschauen. Falls noch jemand Ergänzungen bzw Erklärungen hat wäre das cool die heir zu sehen vielleicht bekommen wir das Posting ja so weit das es FAQ-würdig wird, denn dieser Punkt fehlt wohl noch. 😃



  • Jo, bei mir hat dieser Code auch nie richtig funktioniert, ich hab das einfach auf WinXP geschoben :). Ich mach's immer so, dass ich nur ne PRINTER_INFO_4 nehme, die dann mit ENUM_PRINTERS_LOCAL fülle und den User den Drucker auswählen lasse, das funktioniert auch sehr gut, wie im Quellcode von graph++ (www.magiccreating.de.vu) zu sehen ist :D.

    EDIT: Wegen dem TheShadow: Ich hab früher BlitzBasic programmiert, da gab es im Forum einen sehr genialen Coder, der hieß TheShadow, darum dachte ich du könntest das sein. 🙂

    cu

    [ Dieser Beitrag wurde am 11.12.2002 um 15:01 Uhr von MagiC Creator editiert. ]



  • //...
    EnumPrinters(PRINTER_ENUM_DEFAULT,NULL,5,NULL,0,&dwNeeded,&dwReturned);
    pinfo5 =  (PRINTER_INFO_5 *)malloc(sizeof(dwNeeded));
    //...
    

    Also das kann ja wohl nicht funktionieren. 😉

    Da gefiel mir der Code vom Petzold irgendwie besser. 🙂



  • @cd9000: Erklär doch mal warum das nicht funktionieren soll. 😕 Bei dem "malloc" vom Petzold bekomme ich einen Compilerfehler 😡 bei der von dir bemängelten Zeile nicht. Ich hab das auchmal den Debug drüberlaufen lassen und es sah alles gut aus.
    🙂 Aber das ich ja was lernen will und sehr gern FlüchtigKeitsfehler begehe 😉 lass ich mich gern belehren. 🙂



  • Das Problem ist das

    sizeof()
    

    Es muss lauten:

    pinfo5 = (PRINTER_INFO_5 *)(malloc(dwNeeded));
    

    Edit: Der Compilerfehler kommt daher, dass beim Petzold die Typumwandlung (PRINTER_INFO_5 😉 vorm malloc fehlt. Das ist aber immer so bei den Codes vom Petzold. Irgendwie hält der nicht sehr viel von Typumwandlungen... 😃

    [ Dieser Beitrag wurde am 12.12.2002 um 16:49 Uhr von macphistox2002 editiert. ]



  • Der Code vom Petzold ist in Bezug auf Typumwandlungen korrekt.

    Sag mir: programmierst du C oder C++?
    Du benutzt keine Klassen, also C?

    Wenn du C programmierst, würde ich die Datei nicht als .cpp abspeichern. 🙂
    Sonst geht der Compiler von C++ Code aus, und der wird viel strenger begutachtet als C-Code. Daher kommen die Fehler, der Petzold schreibt nämlich nur C-Code, wie er sehr weit vorne erklärt.


Anmelden zum Antworten