Last Updated 2002/09/17
Programming Tips Visual C++ MFC 印刷  索 引 
DEVMODEの取得
2002/09/17

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);
}


参照
前後のTips
DEVMODEの取得

DSS ProgrammingTipsCGI Ver2.02