Windows 8 でプリンター オブジェクトのコンテキスト メニューからのプリンター名の取得に失敗する

現象
Windows 8 において、プリンター オブジェクトのコンテキスト メニューからプリンター名を取得しようとすると、Windows 7 以前とは異なる結果になります。

Windows 8 で、IShellItem2 インターフェイスの GetProperty() メソッドに PKEY_Devices_InterfacePaths を指定して呼び出すと、以下のような形式の文字列が取得されます。

{0ECEF634-6EF0-472A-8085-5AD023ECBCCD},\\?\SWD#PRINTENUM#{80E75EDB-67FB-4E81-A155-EBA759ADF290}#{0ecef634-6ef0-472a-8085-5ad023ecbccd}

一方、Windows 7 以前では、以下のような "\\サーバー名\プリンター名" 形式の文字列が取得されます。

{0ECEF634-6EF0-472A-8085-5AD023ECBCCD},\\ServerName\PrinterName

解決方法
Windows 8 では PKEY_Devices_FriendlyName を利用することで "\\サーバー名\プリンター名" 形式の文字列が取得可能です。


- コード例
:
IShellItem2 *pShellItem2;
hr = pShellItem2->GetProperty(PKEY_Devices_FriendlyName, &propVar);

if (SUCCEEDED(hr)) {
if (VT_LPWSTR == propVar.vt) {
MessageBox(NULL, propVar.pwszVal, L"Test", MB_OK);
}
PropVariantClear(&propVar);
}
:

詳細
PKEY_Devices_InterfacePaths では、1 つのプリンターオブジェクトに複数のプリンターが設定されている場合、すべてのプリンター名を配列として取得できていました。
しかし、KEY_Devices_FriendlyName は 1 つのプリンター名しか取得できません。
すべてのプリンターの情報を取得するためには、EnumPrinters() 関数によりプリンターを列挙し、KEY_Devices_FriendlyName で取得したプリンター名と比較するというような処理が必要となります。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:2827856 - 最終更新日: 09/29/2016 14:53:00 - リビジョン: 5.0

Windows 8, Windows 8 Enterprise, Windows 8 Pro, Windows Server 2012 Datacenter, Windows Server 2012 Essentials, Windows Server 2012 Foundation, Windows Server 2012 Standard

  • KB2827856
フィードバック