druckeransteuerung usb - help!



  • ich versuche gerade aus einem c++ programm einen usb-drucker anzusteuern und direkt aus dem programm einen string (oder ein .txt file) - nur text, keine grafik!!- auszudrucken. das ganze soll ohne druckerdialog vor sich gehen. nach einiger recherche hab ich herausgefunden, dass das wohl nur über winapi geht.
    hat das schon jemand gemacht und kann mir hier einen lauffähigen code posten oder tipps geben? ich hab nämlich nicht besonders viel ahnung von winapi....
    daaaanke!



  • Bin mir gerade nicht ganz im Klaren, ob du den Drucker direkt ansprechen willst, oder eben "normal".
    Falls letzteres - was ich eher vermute - MSDN: Printing and Print Spooler 🙂



  • ich weiß nicht genau was du mit "direkt" oder "normal" meinst... www.msdn.com forste ich jedoch seit einigen stunden erfolglos durch...
    mir ist das völlig egal wie ich den usb drucker ansteure, hauptsache ich hab nachher einen ausdruck!! bisher hab ichs noch nicht hinbekommen 😞

    das hier ist mein neuster versuch den ich mir mit hilfe des buchs "windows-programmierung" von charles petzold zusammengereimt hab. ich bekomme keine fehler, es passiert aber auch nix... ist wohl einfach nicht auf usb ausgelegt das ganze, und ausdrücklich steht über usb überhaupt nichts in dem buch... vielleicht hat ja jemand einen tipp...

    #include <windows.h>
    
    //Gerätekontext ermitteln
    HDC GetPrinterDC(void)
    {
    	DWORD				dwNeeded, dwReturned;
    	HDC					hdc;
    	PRINTER_INFO_4		* pinfo4;
    
    		EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4, NULL, 0, &dwNeeded, &dwReturned);
    		pinfo4=(PRINTER_INFO_4*)malloc(dwNeeded);
    		EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4, (PBYTE) pinfo4, dwNeeded, &dwNeeded, &dwReturned);
    
    		hdc=CreateDC(NULL, pinfo4->pPrinterName, NULL, NULL);
    		free(pinfo4);
    
    	return hdc;
    }
    
    //Druckerkontext + Höhe und breite der Seite
    void PageGDICalls(HDC hdcPrn, int cxPage, int cyPage)
    {
    	static TCHAR szTextStr[]=TEXT("Hallo, Drucker!");
    
    	Rectangle (hdcPrn, 0, 0, cxPage, cyPage);
    
    	MoveToEx	(hdcPrn, 0, 0, NULL);
    	LineTo		(hdcPrn, cxPage, cyPage);
    	MoveToEx	(hdcPrn, cxPage, 0, NULL);
    	LineTo		(hdcPrn, 0, cyPage);
    
    	SaveDC(hdcPrn);
    
    	SetMapMode			(hdcPrn, MM_ISOTROPIC);
    	SetWindowExtEx		(hdcPrn, 1000, 1000, NULL);
    	SetViewportExtEx	(hdcPrn, cxPage/2, -cyPage/2, NULL);
    	SetViewportOrgEx	(hdcPrn, cxPage/2, cyPage/2, NULL);
    
    	Ellipse(hdcPrn, -500, 500, 500, -500);
    
    	SetTextAlign(hdcPrn, TA_BASELINE | TA_CENTER);
    	TextOut(hdcPrn, 0, 0, szTextStr, lstrlen(szTextStr));
    
    	RestoreDC(hdcPrn, -1);
    }
    
    BOOL PrintMyPage(HWND hwnd)
    {
    	static DOCINFO di={sizeof(DOCINFO), TEXT("Print1: Druck")};
    	BOOL	bSuccess=TRUE;
    	HDC		hdcPrn;
    	int		xPage, yPage;
    
    	if(NULL==(hdcPrn=GetPrinterDC()))
    		return FALSE;
    
    	xPage=GetDeviceCaps(hdcPrn, HORZRES);
    	yPage=GetDeviceCaps(hdcPrn, VERTRES);
    
    	if(StartDoc(hdcPrn, &di)>0)
    	{
    		if(StartPage(hdcPrn)>0)
    		{
    			PageGDICalls(hdcPrn, xPage, yPage);
    
    			if(EndPage(hdcPrn)>0)
    					EndDoc(hdcPrn);
    			else
    				bSuccess=FALSE;
    		}
    	}
    	else
    		bSuccess=FALSE;
    
    	DeleteDC(hdcPrn);
    	return bSuccess;
    }
    
    void main()
    {
    HDC GetPrinterDC(void);
    void PageGDICalls(HDC, int, int);
    BOOL PrintMyPage(HWND);
    
    HINSTANCE hInst;
    TCHAR	szAppName[]=TEXT("Print1");
    TCHAR	szCaption[]=TEXT("Druckprogramm1");
    }
    


  • 1.) In PrintMyPage ist hdcPrn gar nicht mehr bekannt
    2.) In main solltest du PageGDICalls nicht direkt aufrufen

    Falls dir das ganze mit Gültigkeitsbereichen noch nicht so ganz klar ist (eigentlich hätte dein Compiler meckern müssen, dass er die Variable nicht kennt) würde ich dir empfehlen erstmal den ganzen Code direkt in main zu schreiben - ist zwar bissl unsaube und unübersichtlich, aber so hast du ja offenbar etwas Probleme damit 🙄



  • hi flenders, danke für die tipps, es funktioniert jetzt *juhuuuuu*


Log in to reply