티스토리 뷰

목차

    반응형

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


    이를 위해 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 프로그램 설치(프로그래밍 예제)

    반응형