통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
[Windows Driver Model] 포럼 마을 입니다.
  마을등급 Windows Driver Model   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 조성배 주민 746 since 2006-12-29
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
마을 게시판
등록된 마을 게시판이
없습니다.
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 강좌&팁
 프린트정보얻기(Do not use EnumPrinters)   | Code Coverage Analysis 2014-04-11 오후 3:08:29
 bjko0oo  bjko0oo님께 메시지 보내기bjko0oo님을 내 주소록에 추가합니다.bjko0oo님의 개인게시판 가기 번호: 212 추천:0  / 읽음:4,066

보통 프린트의 정보를 얻기 위해  EnumPrinters 함수를 호출하여 설치 된 프린트 정보나 언어등을 얻어 오는 방법이 있습니다. 하지만 이 글은 위 함수를 사용하지 않고 Registry정보만으로 프린트 정보를 가져오는 샘플 소스를 언급하려 합니다.

 

일단 EnumPrinters 함수에 대해 알아봅시다.

 

EnumPrinters function
The EnumPrinters function enumerates available printers, print servers, domains, or print providers.

 

BOOL EnumPrinters(
  _In_   DWORD Flags,
  _In_   LPTSTR Name,
  _In_   DWORD Level,
  _Out_  LPBYTE pPrinterEnum,
  _In_   DWORD cbBuf,
  _Out_  LPDWORD pcbNeeded,
  _Out_  LPDWORD pcReturned
);

 

http://msdn.microsoft.com/en-us/library/windows/desktop/dd162692(v=vs.85).aspx

 

위 URL로 들어가면 좀더 자세한 정보를 얻을 수 있습니다. 대략 구해오는 정보는 프린트 정보에 대한 플래그 값, 설명, 프린트 이름, 프린트 설명, 포트이름, 위치, 모드, 사용하는 프린트 프로세서등의 여러가지 정보를 얻어 오실 수 있습니다. 보통 아래 구조체의 정보라고 보시면 됩니다. 일반적으로...

 

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;

 

 

이 외에도 다른 방법이 있어 소개드리려고 합니다. 소스는 아래와 같습니다.

void CPrintInfoDlg::OnGetPrintInfo()

{

        CString str;

        CHAR print_list[MAX_PARINTNAME*20]    = {0,};        // 20EA 까지만하자.

        CHAR default_name[MAX_PARINTNAME]     = {0,};

        CHAR detail_name[MAX_PARINTNAME]      = {0,};

        CHAR szPrintLanguage[20]              = {0,};

        CHAR szPrintRegPath[512]              = {0,};

        int length = 0;

 

        HKEY    hKey    = NULL;

        DWORD   dwtype  = REG_MULTI_SZ;

        DWORD   dwBytes = 20;

       

        CFile   cPrintInfofile;

        CHAR    szUserName[20]                        = {0,};

        DWORD   dwUserLen                                    = 20;

        time_t  timeStamp                                    = 0;

 

        time(&timeStamp);

        GetUserName(szUserName, &dwUserLen);

        wsprintf(g_szPrintLogPath, "C:\\PrintInfo_%s_%d.log", szUserName, timeStamp);

 

        cPrintInfofile.Open(g_szPrintLogPath, CFile::modeCreate|CFile::modeWrite);

        m_hList.ResetContent();

        GetProfileString("devices", NULL, "", print_list, MAX_PARINTNAME*20);

       

    while( strlen(print_list + length) )

        {

        GetProfileString("devices", print_list + length, "", detail_name, MAX_PARINTNAME);

 

               ZeroMemory(szPrintRegPath, 512);

               ZeroMemory(szPrintLanguage, 20);

               dwBytes = 20;

               wsprintf(szPrintRegPath, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers\\%s\\DsDriver\\", print_list + length);

               LONG iResult = RegOpenKey(HKEY_LOCAL_MACHINE, szPrintRegPath, &hKey);

 

               if(iResult == ERROR_SUCCESS)

               {

                       iResult = RegQueryValueEx(hKey, "printLanguage", NULL, &dwtype, (LPBYTE)szPrintLanguage, &dwBytes );

                       if ( iResult != ERROR_SUCCESS )

                       {

                             

                       }

                       RegCloseKey(hKey);

                       hKey = NULL;

               }

               else

               {

 

               }

              

               if ( !szPrintLanguage[0])

               {

                       strcpy(szPrintLanguage, "NULL");

               }

 

        str.Format("%s, %s, %s", print_list + length, detail_name, szPrintLanguage);

       

        length += strlen(print_list + length) + 1;

               m_hList.AddString(str);

               str += "\r\n";

               cPrintInfofile.Write(str.GetBuffer(0), str.GetLength());

    }

       

        GetProfileString("windows", "device", ",,,", default_name, MAX_PARINTNAME);

        str.Format("기본설정프린트: %s", default_name);

        m_hList.AddString(str);

        str += "\r\n";

        cPrintInfofile.Write(str.GetBuffer(0), str.GetLength());

       

        cPrintInfofile.Close();

}

 

위 소스는 LictCtrl에 프린트 정보를 출력하는 소스입니다. 원리는 간단합니다 프린트의 리스트를 구해온다음에 프린트 이름으로 레지스트리에서 정보를 읽는 방법입니다.

"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers" 에 설치 된 프린트의 목록이 있습니다.

 

 

여기서부터는 프린트의 상세정보를 얻으려면 변수 값을 GetProfileString에 인자로 사용하여 값을 가져 올 수 있습니다.

 

 

우와~ 프린트에 대한 많은 정보들이 숨어져 있습니다. 물론 이 정보들은 EnumPrinters를 통하여 가져 올 수 있지만 몇몇 정보는 여기서만 얻을 수 있는 정보들이 눈에 보이실 겁니다.

굳이 메모리를 낭비하여 모든 정보를 가져오는 방법보다는 내가 필요한 부분의 정보만을 사용하기 위해서는 레지스트리에서 얻는 방법도 괜찮다고 생각됩니다.

 

감사합니다.

출처 : http://rurury.tistory.com/entry/프린트정보얻기Not-Use-EnumPrinters

코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.