|
|
1.1 ! root 1: /******************************************************************************\ ! 2: * ! 3: * MODULE: ENUMPRT.C ! 4: * ! 5: * PURPOSE: To enumerate all system printers and to display the ! 6: * corresponding PRINTER_INFO_1 and PRINTER_INFO_2 info. ! 7: * ! 8: * FUNTIONS: EnumPrtDlgProc() - processes dialog messages ! 9: * SetEnumPrtDlgFields() - formats data returned by ! 10: * EnumPrinters and inserts in ! 11: * listbox. ! 12: * ! 13: \******************************************************************************/ ! 14: ! 15: #include <windows.h> ! 16: #include <winspool.h> ! 17: #include <string.h> ! 18: #include "lookup.h" ! 19: #include "enumprt.h" ! 20: #include "printer.h" ! 21: ! 22: ! 23: ! 24: /******************************************************************************\ ! 25: * ! 26: * FUNCTION: EnumPrtDlgProc (standard dialog procedure INPUTS/RETURNS) ! 27: * ! 28: * LOCAL VARS: pPrtInfo1 - pointer to array of PRINTER_INFO_1 structs ! 29: * pPrtInfo2 - pointer to array of PRINTER_INFO_2 structs ! 30: * dwMaxPrt - number of printers returned by EnumPrinters() ! 31: * dwCurrPrt - index of printer whose info is currently ! 32: * listed in listbox ! 33: * ! 34: * COMMENTS: On the WM_CREATE we go out & enum all system printers, ! 35: * Then we throw all the info about the first on the the ! 36: * dialog's listbox, and allow user to look at next/prev ! 37: * printer's info also. ! 38: * ! 39: \******************************************************************************/ ! 40: ! 41: BOOL APIENTRY EnumDlgProc (HWND hDlg, UINT message, UINT wParam, ! 42: LONG lParam) ! 43: { ! 44: static LPPRINTER_INFO_1 pPrtInfo1; ! 45: static LPPRINTER_INFO_2 pPrtInfo2; ! 46: ! 47: static DWORD dwMaxPrt; ! 48: ! 49: switch (message) ! 50: { ! 51: case WM_INITDIALOG: ! 52: { ! 53: DWORD dwEnumFlags = PRINTER_ENUM_LOCAL | PRINTER_ENUM_FAVORITE; ! 54: DWORD dwBytesNeeded; ! 55: DWORD dwPrtRet1, dwPrtRet2; ! 56: ! 57: EnumPrinters (dwEnumFlags, NULL, 1, NULL, 0, &dwBytesNeeded, ! 58: &dwPrtRet1); ! 59: ! 60: pPrtInfo1 = (LPPRINTER_INFO_1) LocalAlloc (LPTR, dwBytesNeeded + 4); ! 61: ! 62: EnumPrinters (dwEnumFlags, NULL, 1, (LPBYTE) pPrtInfo1, ! 63: dwBytesNeeded, &dwBytesNeeded, &dwPrtRet1); ! 64: ! 65: EnumPrinters (dwEnumFlags, NULL, 2, NULL, 0, &dwBytesNeeded, ! 66: &dwPrtRet2); ! 67: ! 68: pPrtInfo2 = (LPPRINTER_INFO_2) LocalAlloc (LPTR, dwBytesNeeded + 4); ! 69: ! 70: EnumPrinters (dwEnumFlags, NULL, 2, (LPBYTE) pPrtInfo2, ! 71: dwBytesNeeded, &dwBytesNeeded, &dwPrtRet2); ! 72: ! 73: dwMaxPrt = dwPrtRet1 > dwPrtRet2 ? dwPrtRet2 : dwPrtRet1; ! 74: SetEnumPrtDlgFields (hDlg, dwMaxPrt, pPrtInfo1, pPrtInfo2); ! 75: break; ! 76: } ! 77: case WM_COMMAND: ! 78: ! 79: switch (LOWORD(wParam)) ! 80: { ! 81: case IDOK: ! 82: { ! 83: LocalFree (LocalHandle ((LPSTR) pPrtInfo1)); ! 84: LocalFree (LocalHandle ((LPSTR) pPrtInfo2)); ! 85: EndDialog(hDlg, TRUE); ! 86: break; ! 87: } ! 88: } ! 89: return (TRUE); ! 90: } ! 91: return (FALSE); ! 92: UNREFERENCED_PARAMETER(lParam); ! 93: } ! 94: ! 95: ! 96: ! 97: /******************************************************************************\ ! 98: * ! 99: * FUNCTION: SetEnumPrtDlgFields ! 100: * ! 101: * LOCAL VARS: buf - temp string buffer ! 102: * i - loop variables ! 103: * ! 104: * COMMENTS: This function formats the info returned by EnumPrinters() ! 105: * into readable strings and inserts them in the listbox. ! 106: * ! 107: \******************************************************************************/ ! 108: ! 109: void SetEnumPrtDlgFields (HWND hDlg, DWORD dwMaxPrt, ! 110: LPPRINTER_INFO_1 pPrtInfo1, ! 111: LPPRINTER_INFO_2 pPrtInfo2) ! 112: { ! 113: char buf[256]; ! 114: WORD i; ! 115: DWORD j; ! 116: ! 117: SendDlgItemMessage (hDlg, DID_LISTBOX, LB_RESETCONTENT, 0, 0); ! 118: ! 119: for (j = 0; j < dwMaxPrt; j++) ! 120: { ! 121: /**************************************************************************\ ! 122: * Stick PRINTER_INFO_1 data in listbox ! 123: \**************************************************************************/ ! 124: ! 125: SendDlgItemMessage (hDlg, DID_LISTBOX, LB_INSERTSTRING, (UINT)-1, ! 126: (LONG) enumstr[0]); ! 127: ! 128: // nothing for Flags yet ! 129: ! 130: outstr (enumstr[1], (pPrtInfo1 + j)->pDescription); ! 131: outstr (enumstr[2], (pPrtInfo1 + j)->pName); ! 132: outstr (enumstr[3], (pPrtInfo1 + j)->pComment); ! 133: ! 134: ! 135: /**************************************************************************\ ! 136: * Stick PRINTER_INFO_2 data in listbox ! 137: \**************************************************************************/ ! 138: ! 139: SendDlgItemMessage (hDlg, DID_LISTBOX, LB_INSERTSTRING, (UINT)-1, ! 140: (LONG) enumstr[4]); ! 141: ! 142: outstr (enumstr[5], (pPrtInfo2 + j)->pServerName); ! 143: outstr (enumstr[6], (pPrtInfo2 + j)->pPrinterName); ! 144: outstr (enumstr[7], (pPrtInfo2 + j)->pShareName); ! 145: outstr (enumstr[8], (pPrtInfo2 + j)->pPortName); ! 146: outstr (enumstr[9], (pPrtInfo2 + j)->pDriverName); ! 147: outstr (enumstr[10], (pPrtInfo2 + j)->pComment); ! 148: outstr (enumstr[11], (pPrtInfo2 + j)->pLocation); ! 149: ! 150: if ((pPrtInfo2 + j)->pDevMode) ! 151: { ! 152: outstr (enumstr[12], ""); ! 153: outstr (enumstr[13], (pPrtInfo2 + j)->pDevMode->dmDeviceName); ! 154: outstr (enumstr[14], NULL); ! 155: outstr (enumstr[15], NULL); ! 156: outstr (enumstr[16], NULL); ! 157: outstr (enumstr[17], NULL); ! 158: outstr (enumstr[18], NULL); ! 159: outstr (enumstr[19], NULL); ! 160: outstr (enumstr[20], NULL); ! 161: outstr (enumstr[21], NULL); ! 162: outstr (enumstr[22], NULL); ! 163: outstr (enumstr[23], NULL); ! 164: outstr (enumstr[24], NULL); ! 165: outstr (enumstr[25], NULL); ! 166: outstr (enumstr[26], NULL); ! 167: outstr (enumstr[27], NULL); ! 168: } ! 169: else ! 170: { ! 171: outstr (enumstr[12], NULL); ! 172: } ! 173: ! 174: outstr (enumstr[28], (pPrtInfo2 + j)->pSepFile); ! 175: outstr (enumstr[29], (pPrtInfo2 + j)->pPrintProcessor); ! 176: outstr (enumstr[30], (pPrtInfo2 + j)->pDatatype); ! 177: outstr (enumstr[31], (pPrtInfo2 + j)->pParameters); ! 178: ! 179: wsprintf (buf, enumstr[32]); ! 180: for (i = 0; i < MAX_NUM_PRT_ATTRIBUTES; i++) ! 181: ! 182: if ((pPrtInfo2 + j)->Attributes & attributes[i].x.dwIndex) ! 183: ! 184: strcat (buf, attributes[i].lpszValue); ! 185: ! 186: outstr2 (buf); ! 187: ! 188: for (i = 0; i < MAX_NUM_PRT_PRIORITIES; i++) ! 189: ! 190: if ((pPrtInfo2 + j)->Priority & priorities[i].x.dwIndex) ! 191: { ! 192: outstr (enumstr[33], priorities[i].lpszValue); ! 193: break; ! 194: } ! 195: if (i == MAX_NUM_PRT_PRIORITIES) ! 196: ! 197: outnum (enumstr[34], (pPrtInfo2 + j)->Priority); ! 198: ! 199: outnum (enumstr[35], (pPrtInfo2 + j)->DefaultPriority); ! 200: outnum (enumstr[36], (pPrtInfo2 + j)->StartTime); ! 201: outnum (enumstr[37], (pPrtInfo2 + j)->UntilTime); ! 202: ! 203: outstr2 (enumstr[38]); ! 204: for (i = 0; i < MAX_NUM_PRT_STATUS; i++) ! 205: ! 206: if ((pPrtInfo2 + j)->Status & status[i].x.dwIndex) ! 207: ! 208: outstr2 (status[i].lpszValue); ! 209: ! 210: outnum (enumstr[39], (pPrtInfo2 + j)->cJobs); ! 211: outnum (enumstr[40], (pPrtInfo2 + j)->AveragePPM); ! 212: } ! 213: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.