본문 바로가기
C++ 200제/코딩 IT 정보

MFC 프린터 오프라인 연결 상태 확인 - 윈도우10 USB

by vicddory 2019. 10. 3.

우선 소스부터 소개하겠습니다. 이 예제 샘플은 로컬 시스템에 설치된 로컬 프린터에 대한 정보를 표시하는 매우 간단한 콘솔 프로그램 소스입니다.


이를 위해 MFC API 레벨2, EnumPrinters() API를 사용하며, 프린터 정보를 PRINTER_INFO_2 구조 배열에 담아 리턴합니다 .

여기에 포함된 일부 정보는 다음과 같습니다.


  • 서버 이름
  • 프린터 이름
  • 공유 이름 (해당하는 경우)
  • 프린터가 연결된 포트
  • 드라이버 이름
  • 관리자가 제공한 의견 및 위치
  • Win9x에서 프린터가 시스템의 기본 프린터 확인

소스 보기

MFC 프린터 상태 얻기.txt


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, NULL2NULL0&cbNeed, &cbReturn);
pi2 = (PRINTER_INFO_2 *)malloc(cbNeed);
 
EnumPrinters(PRINTER_ENUM_LOCAL, NULL2, (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 설명은 아래 사이트를 참고하시는 게 좋습니다.



 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 회전 명령어 예제

제브라 인쇄 시, 글씨 잘림 해결 PW LH ZPL 명령어 [GT800]

GT800 제브라 프린터 드라이버 designer 프로그램 설치(프로그래밍 예제)