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

適用対象: Windows 8Windows 8 EnterpriseWindows 8 Pro

現象


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 で取得したプリンター名と比較するというような処理が必要となります。