티스토리 뷰
목차
우선 소스부터 소개하겠습니다. 이 예제 샘플은 로컬 시스템에 설치된 로컬 프린터에 대한 정보를 표시하는 매우 간단한 콘솔 프로그램 소스입니다.
이를 위해 MFC API 레벨2, EnumPrinters() API를 사용하며, 프린터 정보를 PRINTER_INFO_2 구조 배열에 담아 리턴합니다 .
여기에 포함된 일부 정보는 다음과 같습니다.
- 서버 이름
- 프린터 이름
- 공유 이름 (해당하는 경우)
- 프린터가 연결된 포트
- 드라이버 이름
- 관리자가 제공한 의견 및 위치
- Win9x에서 프린터가 시스템의 기본 프린터 확인
소스 보기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include "winspool.h" int rtn = 0; PRINTER_INFO_2 *pi2; DWORD cbNeed, cbReturn; EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &cbNeed, &cbReturn); pi2 = (PRINTER_INFO_2 *)malloc(cbNeed); EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 2, (PBYTE)pi2, cbNeed, &cbNeed, &cbReturn); for (int i = 0; i < cbReturn; i++) { if (lstrcmp(pi2[i].pPrinterName, "SAM4S GIANT-100") == 0) { // 연결 O = 4160, 연결 X = 5184) // 연결 안 되면 H400(dec 1024)이 누적된 에러값 얻음 if (pi2[i].Attributes == 4160) { //m_pDevCmn->fnAPL_ActionJnlPrint("주방상태", "◈◈◈ 정상 ◈◈◈"); rtn = T_OK; break; } else { //m_pDevCmn->fnAPL_ActionJnlPrint("주방상태", "◈◈◈ 4160 아님 ◈◈◈"); rtn = T_ERROR; break; } } } free(pi2); | cs |
MFC 18번 라인이 핵심입니다.
기본적으로 USB로 연결된 프린터는 아래 상태 값을 합산하여 10진수 4160으로 나와야 합니다. 하지만, 연결되지 않은 H400 값이 더해지면 10진수 변환 값은 5184로 증가합니다.
- PRINTER_ENUM_CONNECTIONS = &H4
- PRINTER_ENUM_DEFAULT = &H1
- PRINTER_ENUM_LOCAL = &H2
- PRINTER_ENUM_NAME = &H8
- PRINTER_ENUM_NETWORK = &H40
- PRINTER_ENUM_REMOTE = &H10
- PRINTER_ENUM_SHARED = &H20
그래서 프린터 설정을 불러올 때, 반환값만으로 상태를 확인할 수 있습니다.
14번 라인처럼 단순히 연결 유무만 확인할 땐 1024를 비교하면 됩니다. 저는 SAM4S 프린터를 확인하므로 "SAM4S GIANT-100"이란 이름으로 전체 프린터 이름에서 비교하였습니다.
해당 정보는 아래 사이트에서 좀 더 자세히 알아볼 수 있습니다.
API 구조체 (MFC)
EnumPrints 구조체는 아래와 같습니다.
1 2 3 4 5 6 7 8 9 | BOOL EnumPrinters( _In_ DWORD Flags, _In_ LPTSTR Name, _In_ DWORD Level, _Out_ LPBYTE pPrinterEnum, _In_ DWORD cbBuf, _Out_ LPDWORD pcbNeeded, _Out_ LPDWORD pcReturned ); | cs |
구조체인 PRINTER_INFO_2 구조는 아래와 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | typedef struct _PRINTER_INFO_2 { LPTSTR pServerName; LPTSTR pPrinterName; LPTSTR pShareName; LPTSTR pPortName; LPTSTR pDriverName; LPTSTR pComment; LPTSTR pLocation; LPDEVMODE pDevMode; LPTSTR pSepFile; LPTSTR pPrintProcessor; LPTSTR pDatatype; LPTSTR pParameters; PSECURITY_DESCRIPTOR pSecurityDescriptor; DWORD Attributes; DWORD Priority; DWORD DefaultPriority; DWORD StartTime; DWORD UntilTime; DWORD Status; DWORD cJobs; DWORD AveragePPM; } PRINTER_INFO_2, *PPRINTER_INFO_2; | cs |
더 상세한 MFC C++ WinAPI 설명은 아래 사이트를 참고하시는 게 좋습니다.
참조 : WINAPI에 있는 프린트 강좌
PRINTER_ENUM_LOCAL |
로컬에 설치된 프린터들의 목록을 가져옴 |
PRINTER_ENUM_NAME |
Name 매개변수로 지정한 이름을 갖는 프린터를 모두 가져옴 |
PRINTER_ENUM_SHARED |
공유된 프린터들의 목록을 가져옴 |
PRINTER_ENUM_CONNECTIONS |
이전에 연결했던 적이 있는 프린터들의 목록을 가져옴 |
PRINTER_ENUM_NETWORK |
네트워크 위치에 있는 프린터들의 목록을 가져옴 (레벨 1에 한함) |
PRINTER_ENUM_REMOTE |
네트워크 위치에 있는 프린터 및 프린터 서버들의 목록을 가져옴 (레벨 1에 한함) |
PRINTER_ENUM_CATEGORY_3D |
3D 프린터들의 목록을 가져옴 |
PRINTER_ENUM_CATEGORY_ALL |
3D 프린터를 포함해서 모든 프린터들의 목록을 가져옴 |
프린터 관련 글
제브라 프린터 프로그래밍 ZPL 사이트, GT800 회전 명령어 예제