Please look following example:
HDC CMyClass::GetPrinterDC(string devName, HDC* hDC, HANDLE* hPrinter, int NumCopies)
{
*hDC = 0;
*hPrinter = 0;
BOOL bVal = OpenPrinter(const_cast<char*>(devName.c_str()),hPrinter,NULL);
if(bVal)
{
long nSize = DocumentProperties(NULL,*hPrinter,const_cast<char*>(devName.c_str()),NULL,NULL,NULL);
BYTE *dv = new BYTE[nSize];
memset(dv,0,nSize);
DEVMODE* devmode = reinterpret_cast<DEVMODE*>(dv);
if(DocumentProperties(NULL,*hPrinter,const_cast<char*>(devName.c_str()),
devmode, NULL,DM_OUT_BUFFER) == IDOK)
{
devmode->dmCopies = NumCopies;
devmode->dmOrientation = DMORIENT_LANDSCAPE;
devmode->dmFields |= (DM_COPIES|DM_ORIENTATION);
if(DocumentProperties(NULL,*hPrinter,const_cast<char*>(devName.c_str()),
devmode,devmode,DM_OUT_BUFFER | DM_IN_BUFFER) == IDOK)
{
*hDC = CreateDC(NULL,const_cast<char*>(devName.c_str()),NULL,devmode);
}
}
delete[] dv;
}
return *hDC;
}
void CMyClass::PrintReport()
{
char buf[255];
DWORD dwSize = sizeof(buf);
Registry reg("Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows",HKEY_CURRENT_USER);
reg.GetString("Device", buf, &dwSize);
reg.Close();
if(buf[0] == 0) return; char *ptr = strchr(buf,',');
if(ptr)
*ptr = 0;
HANDLE hPrinter = 0;
HDC hDC = 0;
GetPrinterDC(buf, &hDC,&hPrinter,1);
if(hDC == 0)
return;
CDC dc;
dc.Attach(hDC); dc.m_bPrinting = TRUE;
}