Using GetOptionAttribute

Important

The modern print platform is Windows' preferred means of communicating with printers. We recommend that you use Microsoft's IPP inbox class driver, along with Print Support Apps (PSA), to customize the print experience in Windows 10 and 11 for printer device development.

For more information, see Modern print platform and the Print support app design guide.

This function is supported only for PostScript Printer Driver (PPD) features. If a certain attribute isn't available, GetOptionAttribute returns E_INVALIDARG.

Output parameters for general option attributes

In the following table, the pdwDataType parameter takes values of the EATTRIBUTE_DATATYPE enumerated type.

General option attribute Output parameters
DisplayName pdwDataType: kADT_UNICODE

pbData: null-terminated Unicode string of the option keyword name's translation string

pcbNeeded: byte count of the Unicode string pointed to by pbData (including the null terminator)

This option attribute is available to any option that EnumOptions can return on a PPD feature.
Invocation pdwDataType: kADT_BINARY

pbData: byte array for the option's InvocationValue

pcbNeeded: byte count of the binary data pointed to by pbData

This option attribute is available to any option that EnumOptions can return on a PPD feature. If the option's InvocationValue is empty, the function sets pdwDataType as above, set pcbNeeded = 0, and then return S_OK.
OrderDependencyValue pdwDataType: kADT_LONG

pbData: the relative order specified by the PPD's OrderDependency or NonUIOrderDependency keyword for this option. Notice that the first parameter of these keywords is a real number that is converted to a LONG and returned.

pcbNeeded: sizeof(LONG)

This option attribute is available only for an option that has an OrderDependency or*NonUIOrderDependency entry in the PPD, and the entry doesn't omit optionKeyword.
OrderDependencySection pdwDataType: kADT_ASCII

pbData: null-terminated ASCII string containing one of following section names: "ExitServer" "Prolog" "DocumentSetup" "PageSetup" "JCLSetup" "AnySetup"

pcbNeeded: byte count of the ASCII string pointed to by pbData (including the null terminator)

This option attribute is available only for an option that has an OrderDependency or NonUIOrderDependency entry in the PPD, and the entry doesn't omit optionKeyword.

Output parameters for specific option attributes

In addition to the general option attributes described earlier, the option attributes listed in the following tables can have limitations on when they're available. Some attributes are available to all options of a specific PPD feature, while others are available only to specific options of their PPD feature. Any such limitations are listed for each option attribute.

Keyword Option attribute Output parameters
InputSlot
RequiresPageRegion pdwDataType: kADT_BOOL

pbData: TRUE if PageRegion invocation code must be sent with the InputSlot invocation code, and FALSE otherwise. This is based on the PPD's RequiresPageRegion keyword. If the keyword is omitted for this input slot option, TRUE is returned for this attribute.

pcbNeeded: sizeof(BOOL)

This option attribute is available to any option of the "InputSlot" PPD feature, except for the driver-generated option "*UseFormTrayTable".
OutputBin
OutputOrderReversed pdwDataType: kADT_BOOL

pbData: TRUE if the binOption's output order is "Reverse", and FALSE if the output order is "Normal". This is based on the PPD's DefaultOutputOrder and ageStackOrder keywords.

pcbNeeded: sizeof(BOOL)

This option attribute is available to any option of the "OutputBin" PPD feature.
PageSize
ImageableArea pdwDataType: kADT_RECT

pbData: a bounding box of the PageSize option's imageable area, as specified by the PPD's ImageableArea keyword, is returned in a RECT structure, whose left and bottom members contain the llx and lly values, and whose right and top members contain the urx and ury values. All values are in microns. The PPD's llx, and lly values are rounded up to the nearest integer before being converted into microns. The PPD's urx and ury values are rounded down to the nearest integer before being converted into microns.

pcbNeeded: sizeof(RECT)

This option attribute is available to any option of "PageSize" PPD feature, except the "CustomPageSize" option.
PaperDimension pdwDataType: kADT_SIZE

pbData: the physical dimension of the PageSize option, as specified by the PPD's PaperDimension keyword, is returned in a SIZE structure, whose cx member contains the width value and whose cy member contains the height value. All values are in microns.

pcbNeeded: sizeof(SIZE)

This option attribute is available to any option of the "PageSize" PPD feature, except the "CustomPageSize" option.
PageSize: CustomPageSize
HWMargins pdwDataType: kADT_RECT

pbData: the four values specified by the PPD's HWMargins keyword are returned in a RECT structure. All values are in microns.

pcbNeeded: sizeof(RECT)

This option attribute is available only to the "CustomPageSize" option of the "PageSize" PPD feature.
MaxMediaHeight pdwDataType: kADT_DWORD

pbData: the value specified by the PPD's *MaxMediaHeight keyword, in microns.

pcbNeeded: sizeof(DWORD)

This option attribute is available only to the "CustomPageSize" option of the "PageSize" PPD feature.
MaxMediaWidth pdwDataType: kADT_DWORD

pbData: the value specified by the PPD's MaxMediaWidth keyword, in microns.

pcbNeeded: sizeof(DWORD)

This option attribute is available only to the "CustomPageSize" option of the "PageSize" PPD feature.
ParamCustomPageSize pdwDataType: kADT_CUSTOMSIZEPARAMS

pbData: an array of CUSTOMPARAM_MAX elements, where each element is a CUSTOMSIZEPARAM structure. Each element of this array stores values specified in the PPD's ParamCustomPageSize keyword's paramOption entry. For paramOption other than "Orientation", lMinVal and lMaxVal values are in microns. For "Orientation", lMinVal and lMaxVal values are in the range of [0, 3].

pcbNeeded: sizeof(CUSTOMSIZEPARAM) * CUSTOMPARAM_MAX

This option attribute is available only to the "CustomPageSize" option of the "PageSize" PPD feature.

For more information, see following note on ParamCustomPageSize.
InstalledMemory
VMOption pdwDataType: kADT_DWORD

pbData: the value specified by the PPD's VMOption keyword, or 0 if the PPD doesn't specify the VMOption keyword for this option.

pcbNeeded: sizeof(DWORD)

This option attribute is available to any option of the "InstalledMemory" PPD feature.
FCacheSize pdwDataType: kADT_DWORD

pbData: the value specified by the PPD's FCacheSize keyword, or 0 if the PPD doesn't specify the FCacheSize keyword for this option.

pcbNeeded: sizeof(DWORD)

This option attribute is available to any option of the "InstalledMemory" PPD feature.

Note on ParamCustomPageSize

Here's some sample code that shows how to obtain the PPD file's original order, min, and max values of the "ParamCustomPageSize Width" entry. The CUSTOMPARAM_WIDTH constant, which is defined in printoem.h, indicates the offset of the CUSTOMSIZEPARAM structure that contains the information related to the Width entry. This structure is one of CUSTOMPARAM_MAX CUSTOMSIZEPARAM structures that form an array of such structures. The printoem.h header defines a set of constants named CUSTOMPARAM_XXX listing the offsets of the structures in this array (Width, Height, WidthOffset, HeightOffset, and Orientation).

PCUSTOMSIZEPARAM  pCSParam;

pCSParam = (PCUSTOMSIZEPARAM)pbData + CUSTOMPARAM_WIDTH;

order = pCSParam->dwOrder;
// Convert lMinVal and lMaxVal from microns to points.
//   To convert microns to inches, divide by 25400.
//   To convert inches to points, multiply by 72.
min = pCSParam->lMinVal / 25400.0 * 72.0;
max = pCSParam->lMaxVal / 25400.0 * 72.0;