DEVMODE 構造体は大きさが可変である.
プリンタ名称から DEVMODE 構造体を取得サンプルは以下のとおり.
/********************************************************************/
/* プリンタ名称からプリンタの現在の設定(DEVMODE構造体)を取り出す
*
* input : CHAR *PrinterName : プリンター名
* etc "Canon LASER SHOT LBP-830"
* DEVMODE **DevMode : 情報構造体
* 内部でメモリ確保する
* (呼び出し側で free() しなければならない
*
* DEVMODE構造体の大きさは不定である.
* サイズを調べるののは GetDEVMODESize()(以下の関数)を使用
*/
/********************************************************************/
LONG GetPrinterDEVMODE(CHAR *PrinterName, DEVMODE **DevMode)
{
BOOL bRtn;
HANDLE hPrn;
LONG MemSize;
DEVMODE *devmode;
LONG rtn;
if( PrinterName == NULL || DevMode == NULL )
return -9422;
*DevMode = NULL;
bRtn = OpenPrinter(PrinterName, &hPrn, NULL);
if( ! bRtn )
return -9423;
MemSize = DocumentProperties(NULL, hPrn, NULL, NULL, NULL, 0);
if( MemSize <= 0 )
return -9425;
devmode = (DEVMODE*)calloc(1, MemSize);
rtn = DocumentProperties(NULL, hPrn, NULL, devmode,
NULL, DM_OUT_BUFFER);
ClosePrinter(hPrn);
if( rtn < 0 ) {
free(devmode);
return -9426;
}
*DevMode = devmode;
return 0;
}
/********************************************************************/
/* DEVMODE構造体のサイズを求める
*/
/********************************************************************/
ULONG GetDEVMODESize(DEVMODE *DevMode)
{
if(DevMode == NULL) return 0;
return (DevMode->dmSize + DevMode->dmDriverExtra);
}
参照