手差し印刷の指定方法について
- 題名: 手差し印刷の指定方法について
- 著者: うに
- 日時: 2003/10/30 20:17:49
- ID: 1243
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: 手差し印刷の指定方法について
- 著者: (・。・))))・・・・
- 日時: 2003/11/01 2:00:19
- ID: 1261
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: 手差し印刷の指定方法について
- 著者: うに
- 日時: 2003/11/01 18:38:21
- ID: 1273
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: 手差し印刷の指定方法について
- 著者: うに
- 日時: 2003/11/03 14:44:01
- ID: 1295
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: 手差し印刷の指定方法について
- 著者: ((・。・))))・・・・
- 日時: 2003/11/09 16:08:22
- ID: 1369
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[5]: 手差し印刷の指定方法について
- 著者: うに
- 日時: 2003/11/09 16:41:53
- ID: 1370
- この記事の返信元:
- この記事への返信:
- ツリーを表示
みなさん、こんにちは。
いつも参考にさせていただいております。
XPで、プリンタの手差しトレイを指定して印刷を行いたいのですが、どうも
うまくいかず、半年くらい悩み続けています。
下記のコードは、
マイクロソフト サポート技術情報 - 140285
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q140/2/85.asp&NoWebContent=1
を参考にしてVisualC 6.0で作ったものですが、用紙サイズ、方向、上下段の
トレイ指定はできるのに、手差し指定だけがうまくいきません。
プリンタは、Canon LBP406G2、Xerox(型番忘却)で行ってみました。
どなたか、解決方法をご存じでないでしょうか?
/**#function#**********************************************
#name :: SetDevMode
#summary :: プリンタ制御
int nBin :: 給紙トレイ
int nSize :: 用紙サイズ
int nDir :: 用紙方向
return DEVMODE* :: DEVMODEポインタ
**********************************************#function#***/
static DEVMODE *SetDevMode(int nBin, int nSize, int nDir)
{
HANDLE hPrinter = NULL;
DWORD dwNeeded = 0;
DWORD dwDMSize = 0;
PRINTER_INFO_2 *pi2 = NULL;
DEVMODE *pDevMode = NULL;
PRINTER_DEFAULTS pd;
BOOL bFlag;
LONG lFlag;
// アクセス権設定
memset(&pd, 0, sizeof(pd));
pd.DesiredAccess = PRINTER_ALL_ACCESS;
// プリンタオープン
bFlag = OpenPrinter(szDevice, &hPrinter, &pd);
if (!bFlag || (hPrinter == NULL)){
MsgBox(NULL, MB_OK, "プリンタ(%s)情報を取得できません", szDevice);
return(NULL);
}
// 情報格納サイズの取得
SetLastError(0);
bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
if ((!bFlag) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER) ||
(dwNeeded == 0)){
ClosePrinter(hPrinter);
MsgBox(NULL, MB_OK, "プリンタ情報格納サイズを取得できません");
return(NULL);
}
// PRINTER_INFO_2 用メモリアロケート
pi2 = (PRINTER_INFO_2 *)AllocMemory(dwNeeded);
if (pi2 == NULL){
ClosePrinter(hPrinter);
MsgBox(NULL, MB_OK, "バッファ(%d)を確保できません", dwNeeded);
return(NULL);
}
// PRINTER_INFO_2 情報格納
bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded);
if (bFlag != TRUE){
FreeMemory(pi2);
ClosePrinter(hPrinter);
MsgBox(NULL, MB_OK, "プリンタ情報を取得できません");
return(NULL);
}
// DENMODE バッファサイズ取得
dwDMSize= DocumentProperties(NULL, hPrinter, szDevice,NULL, NULL, 0);
if (dwDMSize <= 0){
FreeMemory(pi2);
ClosePrinter(hPrinter);
MsgBox(NULL, MB_OK, "DocumentProperties() サイズ取得エラー");
return(NULL);
}
// DEVMODE バッファ確保
pDevMode = (DEVMODE *)AllocMemory(dwDMSize);
if (pDevMode == NULL){
FreeMemory(pi2);
ClosePrinter(hPrinter);
MsgBox(NULL, MB_OK, "バッファアロケートエラー");
return(NULL);
}
// PRINTER_INFO_2 に、DEVMODE が格納されていない場合(希)
if (pi2->pDevMode == NULL){
MsgBox(NULL, MB_OK, "pi2->pDevMode == NULL !!");
lFlag = DocumentProperties(NULL, hPrinter,
szDevice,
pDevMode, NULL,
DM_OUT_BUFFER);
if (lFlag != IDOK || pDevMode == NULL){
FreeMemory(pDevMode);
FreeMemory(pi2);
ClosePrinter(hPrinter);
MsgBox(NULL, MB_OK, "DocumentProperties()情報取得エラー");
return(NULL);
}
pi2->pDevMode = pDevMode;
}
else{
memcpy(pDevMode, pi2->pDevMode, dwDMSize);
}
// 印刷設定
pDevMode->dmOrientation = nDir;
pDevMode->dmDefaultSource = nBin;
pDevMode->dmPaperSize = nSize;
pDevMode->dmFields = DM_ORIENTATION | DM_PAPERSIZE | DM_DEFAULTSOURCE;
// ドライバ依存部分の更新
lFlag = DocumentProperties(NULL, hPrinter, szDevice, pDevMode, pDevMode, DM_IN_BUFFER | DM_OUT_BUFFER);
if (lFlag != IDOK){
FreeMemory(pi2);
ClosePrinter(hPrinter);
FreeMemory(pDevMode);
MsgBox(NULL, MB_OK, "DocumentProperties()エラー");
return(NULL);
}
// セキュリティなし
pi2->pSecurityDescriptor = NULL;
// プリンタ情報の更新
bFlag = SetPrinter(hPrinter, 2, (LPBYTE)pi2, 0);
if (!bFlag){
FreeMemory(pi2);
ClosePrinter(hPrinter);
FreeMemory(pDevMode);
MsgBox(NULL, MB_OK, "SetPrinter() エラー");
return(NULL);
}
FreeMemory(pi2);
ClosePrinter(hPrinter);
return(pDevMode);
}
※AllocMemory()、FreeMemory()、MsgBox() は自作の関数です。