2016-05-24 70 views
0

"Open With"機能を実装しようとしているときに、UWPアプリケーションからアイコンを抽出する際に問題が発生しました。だから、SHAssocEnumHandlersの助けを借りて、特定のファイルを開くための推奨アプリケーションのリストを受信した後、私はIAssocHandler::GetIconLocationと古典的なExtractIcon()の助けを借りて、これらのアプリケーションのそれぞれのアイコンを抽出しようとしている。すべては、たとえば、ペイントのようなプログラムでうまくいきます。私はペイントバイナリへの完全なパスを持っており、そこからアイコンを抽出することができます。しかし、 "3Dビルダー"、 "写真"、その他のUWPアプリケーションのようなアプリケーションでは、アイコンの位置は@{Microsoft.Windows.Photos_16.511.8630.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.Windows.Photos/Files/Assets/PhotosAppList.png}のようになります。私はいくつかの異なるAPIを試してアイコンを抽出し、毎回FILE_NOT_FOUNDエラーを受け取りました。だから、誰も私にヒントを与えることができますが、その場合アイコンを抽出するために関数を使うことができますか?ソースコードの いくつかの部分は、状況を明確にするために追加UWPアプリケーションからアイコンを抽出

UPDATE:私は解決策を見つけたよう

// m_handlers is a member of type std::vector<CComPtr<IAssocHandler>> 

HRESULT FileManager::GetAssocHandlers(const std::wstring& strFileExtension, ASSOC_FILTER filter) 
{ 
    HRESULT hr = S_OK; 
    CComPtr<IEnumAssocHandlers> enumerator; 

    m_handlers.clear(); 

    hr = SHAssocEnumHandlers(strFileExtension.c_str(), filter, &enumerator); 
    if (SUCCEEDED(hr)) 
    { 
     for (CComPtr<IAssocHandler> handler; 
      enumerator->Next(1, &handler, nullptr) == S_OK; 
      handler.Release()) 
     { 
      m_handlers.push_back(handler); 
     } 
    } 

    return hr; 
} 

HRESULT FileManager::GetAssociatedPrograms(BSTR bstrFileName, BSTR* bstrRet) 
{ 
    ... 
    hr = GetAssocHandlers(strFileExtension, ASSOC_FILTER_RECOMMENDED); 
    if (SUCCEEDED(hr)) 
    { 
     ... 
     for (auto& handler : m_handlers) 
     { 
      ... 
      if (SUCCEEDED(handler->GetIconLocation(&tmpStr, &resourceIndex))) 
      { 
       // And this is where I get classic full file path to regular 
       // applications like "MS Paint" or this weird path mentioned 
       // above for "Photos" UWP application for example which can't 
       // be used in regular ExtractIcon functions. 
      } 
     } 
    } 
} 
+4

ええと、標準の「ExtractAssociatedIcon」API関数が正常に機能していることは間違いありませんでした。 shell32.dllからエクスポートされます。 PNGファイルへのこのパスを取得する場所は不明です。 「取得したアイコンの位置がどのように見えますか」と言うとどういう意味ですか?どこから得た? 'ExtractIcon'と' ExtractAssociatedIcon'は文字列やパスではなくHICONを返します。あなたがしようとしているコードを投稿するとよいスタートになるでしょう。あなたのコメントのために@CodyGrayに感謝します。 –

+0

状況を明らかにするためのコードをいくつか追加しました。私がしようとしているのは、たとえば* .jpgファイルを開くための推奨アプリケーションのリストを取得することです。私が推奨アプリケーションのリストを取得した後、左側にアイコンがある「Open With」コンテキストメニューに表示したい(Windowsエクスプローラとほぼ同じ)したがって、推奨アプリケーションがUWPアプリケーションの場合、この推奨アプリケーション用のIAssocHandler :: GetIconLocationはPNGファイルへのこの奇妙なパスを返します。希望、それは今より明確です。 –

答えて

4

が見えます。 UWPアプリケーション用に提供されるアイコンの場所パスは、MSDNによると「間接文字列」と呼ばれます。この間接文字列をSHLoadIndirectString関数に渡すことができ、アイコンのPNGファイルへの通常のフルパスを受け取ります。私の場合、SHLoadIndirectString()に@{Microsoft.Windows.Photos_16.511.8630.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.Windows.Photos/Files/Assets/PhotosAppList.png}を渡した後、私はそのようなパスを受け取りました:C:\Program Files\WindowsApps\Microsoft.Windows.Photos_16.511.8630.0_neutral_split.scale-125_8wekyb3d8bbwe\Assets\PhotosAppList.scale-125.pngそしてその後、私はそれを使ってアイコン自体を表示することができます。

+0

ありがとうございます。 SHLoadIndirectString関数は、Windowsストアアプリケーションのアイコンを取得するのに役立ちました。 – Boogier

関連する問題