2016-08-19 9 views
1

DeviceCapabilitiesを使用してネットワークプリンタのサポートされているページサイズのリストを取得しようとしており、sPortパラメータと完全に混同しています。ネットワークプリンタのデバイス能力

DWORD nPapersCount = ::DeviceCapabilities(sPrinter, sPort, DC_PAPERS, nullptr, nullptr); 

誰もが、私を提案でした私は、ネットワークプリンタ用のスポーツに何を提供する必要がありますし、どのように私は確実にそのポートを得ることができましたか?

実験では、 "\\ Share"という形式の "\\ Share \ LPT1"という形式のPC名を試しましたが、 "LPT1"だけで運がありません。

また、私はEnumPortsの機能を見つけたので、リモートサーバー上のプリンタポ​​ートの一覧を取得できましたが、サーバー上の複数のプリンタのポートの一覧をどう扱うかわかりません。

typedef struct _PORT_INFO_2 { 
    LPTSTR pPortName; 
    LPTSTR pMonitorName; 
    LPTSTR pDescription; 
    DWORD fPortType; 
    DWORD Reserved; 
} PORT_INFO_2, *PPORT_INFO_2; 

答えて

1

あなたは特別なネットワークプリンタの場合には、ポート名を推測することはできません。現在選択されているプリンタから情報を取得するにはPrintDlgを使用してください(これは印刷ダイアログを表示せずに行うことができます)。

メンバーのポート名は、PRINTDLGの構造体で使用できます。

DEVNAMES structure

typedef struct tagDEVNAMES { 
    WORD wDriverOffset; 
    WORD wDeviceOffset; 
    WORD wOutputOffset; //<= port name 
    WORD wDefault; 
} DEVNAMES, *LPDEVNAMES; 

ユニコード例:

PRINTDLG pdlg = { sizeof PRINTDLG }; 
pdlg.Flags = PD_RETURNDEFAULT; 
PrintDlg(&pdlg); 

LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(pdlg.hDevNames); 
std::wstring device = (LPCTSTR)lpDev + lpDev->wDeviceOffset; 
std::wstring port = (LPCTSTR)lpDev + lpDev->wOutputOffset; 
::GlobalUnlock(pdlg.hDevNames); 

//clean up after PrintDlg, as pointed out by @RemyLebeau 
GlobalFree(pdlg.hDevMode); 
GlobalFree(pdlg.hDevNames); 

int nPapersCount; 
nPapersCount = ::DeviceCapabilities(device.c_str(), port.c_str(), DC_PAPERS, NULL, NULL); 
if (nPapersCount > 0) 
{ 
    WORD* sizeBuf = new WORD[nPapersCount]; 
    DeviceCapabilities(device.c_str(), port.c_str(), DC_PAPERS, (LPTSTR)sizeBuf, NULL); 
    for (int i = 0; i < nPapersCount; i++) 
     std::wcout << sizeBuf[i] << "\n"; 
    delete[] sizeBuf; 
} 
+0

は 'PRINTDLGに' hDevMode'、 'hDevNames'、と' hDC'ハンドルを解放することを忘れないでください '構造体を使用し終わった後。 'GlobalFree()'と 'DeleteDC()'を使ってください。あなたは 'PD_RETURNDC'が必要ですか?あなたは何でも 'hDC'を使用していません。 –

+0

@RemyLebeau割り当てがないので、 'GlobalFree'は必要ありません。 DCもありません。 'PD_RETURNDC'は不要で、削除しました。 –

+1

['PRINTDLG'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646843.aspx)のドキュメントには、' hDevMode'と 'hDevNames'がNULLの場合に割り当てられることが明確に書かれています入力。それは、 'PD_RETURNDEFAULT'がその動作を変更するかどうかということです。それは、システムのデフォルトプリンタを処理するように設定されているということだけです。彼らは割り当てられていますか?またはそれらは静的でOSによって所有されていますか?ドキュメンテーションはどちらか一方の方法を言いません。しかし、ほとんどの 'PD_RETURNDEFAULT'の例では' GlobalFree() 'を呼び出すことができます。 –

関連する問題