DocumentProperties() 함수를 사용하여 프린터 설정 수정

이 문서에서는 함수를 사용하여 프린터 설정을 수정하는 방법을 보여 줍니다 DocumentProperties() .

원래 제품 버전: 프린터
원본 KB 번호: 167345

요약

DEVMODE 구조를 사용하여 프린터 설정을 수정하는 것은 구조체의 필드를 변경하는 것보다 더 어렵습니다. 특히 디바이스에 대한 유효한 DEVMODE 구조에는 함수에서만 수정 DocumentProperties() 할 수 있는 프라이빗 데이터가 포함됩니다.

이 문서에서는 함수를 사용하여 DEVMODE 구조체의 내용을 수정하는 DocumentProperties() 방법을 설명합니다.

추가 정보

Win32 SDK에 설명된 DEVMODE 구조체에는 퍼블릭 또는 '디바이스 독립적 데이터' 및 프라이빗 또는 '디바이스 종속 데이터'가 포함됩니다. DEVMODE의 프라이빗 부분은 DEVMODE 구조에 의해 정의된 공용 파트 바로 다음에 인접한 메모리 버퍼에 존재합니다.

프로그램은 프린터와 프린터, 버전과 프린터 드라이버 버전이 다르기 때문에 이 버퍼의 크기를 예측할 수 없습니다. 또한 프로그램에서 선언한 DEVMODE 구조체에는 개인 디바이스 데이터에 대한 충분한 공간이 없습니다. 프라이빗 데이터가 없는 DEVMODE 버퍼가 , ResetDC()및 와 DocumentProperties()같은 CreateDC()함수에 전달되면 함수가 실패할 수 있습니다.

디바이스 드라이버에서 DEVMODE를 안정적으로 사용하려면 다음 단계에 따라 만들고 수정합니다.

  1. 디바이스에서 필요한 버퍼 크기를 확인한 다음 충분한 메모리를 할당합니다.

    DocumentProperties() 는 마지막 매개 변수가 0으로 설정된 경우 DEVMODE 버퍼에 필요한 바이트 수를 반환합니다. 이 문서의 샘플 코드는 이 기술을 사용하여 버퍼의 올바른 크기를 결정합니다. 그런 다음 샘플 코드는 의 malloc() C 런타임 메모리 할당 함수를 사용하여 충분히 큰 버퍼를 할당합니다. DocumentProperties() 및 함수는 DEVMODE에 대한 포인터를 매개 변수로 사용 ResetDC() 하므로 CreateDC() 대부분의 애플리케이션은 포인터로 처리되는 메모리를 할당할 수 있습니다.

    그러나 일반적인 PrintDlg() 함수와 같은 함수는 전역 메모리에 대한 핸들이어야 하는 매개 변수를 사용합니다. 프로그램에서 이러한 함수 중 하나에 대한 매개 변수로 최종 DEVMODE 버퍼를 사용하는 경우 를 사용하여 GlobalAlloc() 메모리를 할당하고 를 사용하여 GlobalLock()버퍼에 대한 포인터를 가져와야 합니다.

  2. 디바이스 드라이버에 기본 설정을 사용하여 DEVMODE 버퍼를 초기화하도록 요청합니다.

    샘플 코드는 두 번째로 를 호출 DocumentProperties() 하여 현재 기본 설정을 사용하여 할당된 버퍼를 초기화합니다. DocumentProperties()명령이 fMode 매개 변수에 전달될 때 DM_OUT_BUFFERpDevModeOutput 매개 변수라고 하는 버퍼를 프린터의 현재 설정으로 채웁니다.

  3. DEVMODE의 공용 부분을 변경하고 를 호출 DocumentProperties()하여 디바이스 드라이버에 변경 내용을 DEVMODE의 프라이빗 부분에 병합하도록 요청합니다.

    2단계에서 현재 설정을 사용하여 버퍼를 초기화한 후 샘플 코드는 DEVMODE의 공용 부분을 변경합니다. DEVMODE 멤버에 대한 설명은 Win32 SDK 설명서를 참조하세요. 이 샘플 코드는 프린터에서 방향 및 이중(양면) 설정을 사용할 수 있는지 여부를 결정하고 적절하게 변경합니다.

    참고

    DEVMODE의 dmFields 멤버에 있는 플래그는 프린터가 연결된 구조체 멤버를 사용한다는 표시일 뿐입니다. 프린터는 다양한 물리적 특성을 가지므로 DEVMODE의 문서화된 기능의 하위 집합만 지원할 수 있습니다. DEVMODE 필드의 지원되는 설정을 확인하려면 애플리케이션에서 를 사용해야 DeviceCapabilities()합니다.

    그런 다음 샘플 코드는 세 번째 호출을 수행하고 DocumentProperties() pDevModeInput 및 pDevModeOutput 매개 변수 모두에서 DEVMODE 버퍼를 전달합니다. 또한 OR("|") 연산자를 사용하여 fMode 매개 변수에서 DM_IN_BUFFER 및 DM_OUT_BUFFER 결합된 명령을 전달합니다. 이러한 명령은 입력 버퍼에 포함된 모든 설정을 사용하고 디바이스의 현재 설정과 병합하도록 함수에 지시합니다. 그런 다음 out 매개 변수에 지정된 버퍼에 결과를 씁니다.

참고

DocumentProperties() 는 프린터 핸들로 특정 프린터를 참조합니다. hPrinter입니다. 이 핸들은 샘플 코드에서도 보여 주는 에서 OpenPrinter()가져옵니다. OpenPrinter() 에는 일반적으로 운영 체제 셸에 표시되는 프린터의 이름인 프린터 이름이 필요합니다. 이 이름은 에서 EnumPrinters()반환 PrintDlg()된 DEVNAMES 구조체 또는 기본 프린터에서 가져올 수 있습니다.

이 문서에서는 버퍼의 올바른 크기를 할당하고 해당 버퍼를 초기화하는 처음 두 단계는 를 사용하여 DocumentProperties()수행됩니다. 를 사용하여 GetPrinter()다음 단계를 수행할 수도 있습니다.

자세한 내용과 예제는 SetPrinter 함수를 사용하여 프린터 설정 수정을 참조하세요.

샘플 코드

샘플 코드는 DEVMODE 버퍼를 가져오고 변경하기 위한 다음 세 단계를 수행합니다. 함수는 명명된 프린터를 사용하고 이러한 기능을 지원하는 경우 양면 및 가로 방향으로 인쇄하도록 DEVMODE를 구성합니다. 호출자에게 반환되는 결과 DEVMODE는 , , SetPrinter()PrintDlg()또는 ResetDC()와 같은 CreateDC()DEVMODE 버퍼를 사용하는 다른 API 호출에 적합합니다. DEVMODE 버퍼를 사용하여 호출자가 완료되면 호출자는 메모리를 해제해야 합니다.

 LPDEVMODE GetLandscapeDevMode(HWND hWnd, char *pDevice)
 {
    HANDLE hPrinter;
    LPDEVMODE pDevMode;
    DWORD dwNeeded, dwRet;
    
    /* Start by opening the printer */ 
    if (!OpenPrinter(pDevice, &hPrinter, NULL))
        return NULL;
    
    /*
    * Step 1:
    * Allocate a buffer of the correct size.
    */ 
    dwNeeded = DocumentProperties(hWnd,
    hPrinter, /* Handle to our printer. */ 
    pDevice, /* Name of the printer. */ 
    NULL, /* Asking for size, so */ 
    NULL, /* these are not used. */ 
    0); /* Zero returns buffer size. */ 
    pDevMode = (LPDEVMODE)malloc(dwNeeded);
    
    /*
    * Step 2:
    * Get the default DevMode for the printer and
    * modify it for your needs.
    */ 
    dwRet = DocumentProperties(hWnd,
    hPrinter,
    pDevice,
    pDevMode, /* The address of the buffer to fill. */ 
    NULL, /* Not using the input buffer. */ 
    DM_OUT_BUFFER); /* Have the output buffer filled. */ 
    if (dwRet != IDOK)
    {
        /* If failure, cleanup and return failure. */ 
        free(pDevMode);
        ClosePrinter(hPrinter);
        return NULL;
    }
    
    /*
    * Make changes to the DevMode which are supported.
    */ 
    if (pDevMode->dmFields & DM_ORIENTATION)
    {
        /* If the printer supports paper orientation, set it.*/ 
        pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
    }
    
    if (pDevMode->dmFields & DM_DUPLEX)
    {
        /* If it supports duplex printing, use it. */ 
        pDevMode->dmDuplex = DMDUP_HORIZONTAL;
    }
    
    /*
    * Step 3:
    * Merge the new settings with the old.
    * This gives the driver an opportunity to update any private
    * portions of the DevMode structure.
    */ 
    dwRet = DocumentProperties(hWnd,
    hPrinter,
    pDevice,
    pDevMode, /* Reuse our buffer for output. */ 
    pDevMode, /* Pass the driver our changes. */ 
    DM_IN_BUFFER | /* Commands to Merge our changes and */ 
    DM_OUT_BUFFER); /* write the result. */ 
    
    /* Finished with the printer */ 
    ClosePrinter(hPrinter);
    
    if (dwRet != IDOK)
    {
        /* If failure, cleanup and return failure. */ 
        free(pDevMode);
        return NULL;
    }
    
    /* Return the modified DevMode structure. */ 
    return pDevMode;
}