Announcement

Collapse
No announcement yet.

Netzwerkdrucker ansprechen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Netzwerkdrucker ansprechen

    Hallo erstmal,

    ich würde gern in C++ per code Text auf einen Netzwerkdrucker ausdrucken und dabei den "CPrintDialog" übergehen. Es funktioniert schon bei Druckern, die an meinem Rechner angeschlossen sind, über Netzwerk allerdings nicht.
    Habe die Foren schon durchsucht, auch schon code gefunden, es funktioniert aber wie gesagt noch nicht endgültig.

    Entwicklungsumgebung: Microsoft Visual Studio 2005
    Betriebssystem: Windows XP

    hier mein code:
    Code:
    void PrintText::OnBnClickedButtonPrint2()
    {
    	CDC* pDC = new CDC();
    	HDC hdcPrinter;
    	hdcPrinter = CreateHandleForPrinter(TEXT("HP Color LaserJet 3600"));
    
    	pDC->Attach(hdcPrinter);	
    	
    	DOCINFO di;
    	di.cbSize=sizeof(DOCINFO);
    	di.lpszDocName=_T("Testdokument");
    	di.lpszOutput=NULL;
    	di.lpszDatatype=NULL;
    	di.fwType=0;
    
    	pDC->StartDoc(&di);
    	pDC->StartPage();
    	pDC->Rectangle(0,0,1350,500);
    	pDC->TextOutW(5, 2, _T("Beliebiger Text"));
    	int erg =pDC->EndPage();
    	if (erg>=0)
    	  pDC->EndDoc();
    	else
    	  pDC->AbortDoc();
    	pDC->Detach();
    
    }
    
    HDC PrintText::CreateHandleForPrinter(LPWSTR printerName) const
    {
    	HANDLE             hPrinter;
    	HDC* m_hDC = new HDC();
    
    	if ( ( ::OpenPrinter(printerName, &hPrinter, NULL ) ) )
    	{
    		LPPRINTER_INFO_2  lpPrinterInfo2 = NULL;
    		DWORD             sizeOfPrintInfo = 0;
    		DWORD             cbReturned = 0;
    
    		::GetPrinter( hPrinter, 2, NULL, 0, &sizeOfPrintInfo );
    
    		lpPrinterInfo2 = (LPPRINTER_INFO_2)new char[sizeOfPrintInfo];
    
    		if ( ::GetPrinter( hPrinter, 2, (LPBYTE)lpPrinterInfo2, sizeOfPrintInfo, &cbReturned ) )
    		{
    			*m_hDC = ::CreateDC( lpPrinterInfo2->pDriverName, lpPrinterInfo2->pPrinterName, NULL, lpPrinterInfo2->pDevMode );
    		}
    
    		delete[] lpPrinterInfo2;
    		lpPrinterInfo2=NULL;
    
    		ClosePrinter( hPrinter );
    	}
    	return *m_hDC;
    }
    Kann mir dann noch jemand sagen wie ich im "LPPRINTER_INFO_2" die Eigenschaft "pDevMode->dmFormName" ändern kann?

    Vielen Dank schon mal für die Hilfe,

    Matze

  • #2
    http://msdn.microsoft.com/en-us/libr...45(VS.85).aspx

    LPDEVMODE pDevMode

    gibt eine Zeiger auf

    http://msdn.microsoft.com/en-us/libr...65(VS.85).aspx

    zurück. Dort kannst du dann dmFormName setzen
    Christian

    Comment


    • #3
      Hi Christian,

      Vielen Dank für die Links, sowas in der Art hatte ich gesucht nur noch nicht gefunden.
      Jetzt fehlt mir nur noch warum mein code für Netzwerkdrucker nicht funktioniert.

      Matze

      Comment


      • #4
        Hi,

        hab jetzt rausgefunden wie ich auf Netzwerkdrucker zugreifen kann.

        Ich muss den DC Beispielsweise so erstellen:
        Code:
        csDriver = TEXT("winspool")
        csPinter = TEXT("\\Rechnername\HP Color LaserJet 3600")
        pDC->Attach(CreateDC( csDriver, csPrinter, NULL, NULL ));
        Den Druckernamen und Treibernamen habe ich über eine Druckerdialog rausbekommen wo ich den gewünschten Drucker ausgewählt und mir im Debug-Modus die Werte angesehen habe.
        Ungefähr so:
        Code:
        CPrintDialog dlg(FALSE);        // Objekt für Dialog konstruieren
        
        if (dlg.DoModal()==IDOK)         // Dialog modal aufrufen
        {                                // abfragen ob mit "OK" verlassen
                        CString device("");
        	CString driver("");
        	device = dlg.GetDeviceName();
        	driver = dlg.GetDriverName();
        ...
        }

        Comment

        Working...
        X