怎么设置打印机的纸张大小

如何设置打印机的纸张大小
主要采用documentProperties和SetPrinter进行设置,可是每次都不成功,奇怪的是设置之后将界面关闭,下一次打开居然就是上一次界面上设置的最近一次的纸张类型,也就是说最近一次是成功的?是不是设置完成要进行类似刷新的操作?在线等。。。。。。。。。。。。。。
一下是本人采用的两种设置打印纸张大小方法:求朋友们指点
	DWORD dwNeeded = 0;
PRINTER_INFO_2 *pi2 = NULL;
PRINTER_DEFAULTS pd;
BOOL bFlag;
LONG lFlag;

// Open printer handle (on Windows NT, you need full-access because you
// will eventually use SetPrinter)...
ZeroMemory(&pd, sizeof(pd));
pd.DesiredAccess = PRINTER_ALL_ACCESS;

bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
if ((!bFlag) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER) || 
(dwNeeded == 0))
{
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}

// Allocate enough space for PRINTER_INFO_2...
pi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
if (pi2 == NULL)
{
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}

// The second GetPrinter fills in all the current settings, so all you
// need to do is modify what you're interested in...
bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded);
if (!bFlag)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}

// If GetPrinter didn't fill in the DEVMODE, try to get it by calling
// DocumentProperties...
if (pi2->pDevMode == NULL)
{
dwNeeded = DocumentProperties(NULL, hPrinter,
(LPWSTR)(LPCTSTR)curPrinter,
NULL, NULL, 0);
if (dwNeeded <= 0)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}

pDevMode = (DEVMODE *)GlobalAlloc(GPTR, dwNeeded);
if (pDevMode == NULL)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}

lFlag = DocumentProperties(NULL, hPrinter,
(LPWSTR)(LPCTSTR)curPrinter,
pDevMode, NULL,
DM_OUT_BUFFER);
if (lFlag != IDOK || pDevMode == NULL)
{
GlobalFree(pDevMode);
GlobalFree(pi2);
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}
pi2->pDevMode = pDevMode;
}

//make sure the prop is supported
if(pi2->pDevMode->dmFields & DM_PAPERSIZE)
{
map<CString ,int >::iterator iter;; 
iter = resMap.find(paperSize);
if(iter == resMap.end())
{
AfxMessageBox(_T("打印机不支持当前纸张类型"));
return FALSE;
}
pi2->pDevMode->dmPaperSize = iter->second;
curDmPaperSize = iter->second; //do not forget,pleaz
}
else
{
GlobalFree(pi2);
//ClosePrinter(hPrinter);
return FALSE;
}

// Do not attempt to set security descriptor...
pi2->pSecurityDescriptor = NULL;

// Make sure the driver-dependent part of devmode is updated...
lFlag = DocumentProperties(NULL, hPrinter,
(LPWSTR)(LPCTSTR)curPrinter,
pi2->pDevMode, pi2->pDevMode,
DM_IN_BUFFER | DM_OUT_BUFFER);
if (lFlag != IDOK)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
hPrinter = NULL;
return FALSE;
}

// Update printer information...
bFlag = SetPrinter(hPrinter, 2, (LPBYTE)pi2, 0);
//maybe we should use ResetDC to get A$ back.

curPaperSize = GetPaperSize();

//  // Tell other apps that there was a change...
//    SendMessageTimeout(HWND_BROADCAST, WM_DEVMODECHANGE, 0L,
//        (LPARAM)(LPCTSTR)curPrinter,
//        SMTO_NORMAL, 1000, NULL);

if (pi2)
GlobalFree(pi2);
//ClosePrinter(hPrinter);

return TRUE;





第二种方法,,,,,,,,,,,,,
DWORD   Errno,buf[2000],len=sizeof(PRINTER_INFO_2);   
PRINTER_INFO_2   pinfo2;   
TCHAR   PrinterName[128];   
LPDEVMODE     lpmod;   
DEVMODE     devmod;   
PRINTDLG       pda;   
PRINTER_DEFAULTS   pDefault;   

memset(&pda,0,sizeof(pda));   
pda.lStructSize   =   sizeof(pda);   
//PD_RETURNDEFAULT使之获得默认打印机的设置且不显示对话框