"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.
}
}
}
}
ええと、標準の「ExtractAssociatedIcon」API関数が正常に機能していることは間違いありませんでした。 shell32.dllからエクスポートされます。 PNGファイルへのこのパスを取得する場所は不明です。 「取得したアイコンの位置がどのように見えますか」と言うとどういう意味ですか?どこから得た? 'ExtractIcon'と' ExtractAssociatedIcon'は文字列やパスではなくHICONを返します。あなたがしようとしているコードを投稿するとよいスタートになるでしょう。あなたのコメントのために@CodyGrayに感謝します。 –
状況を明らかにするためのコードをいくつか追加しました。私がしようとしているのは、たとえば* .jpgファイルを開くための推奨アプリケーションのリストを取得することです。私が推奨アプリケーションのリストを取得した後、左側にアイコンがある「Open With」コンテキストメニューに表示したい(Windowsエクスプローラとほぼ同じ)したがって、推奨アプリケーションがUWPアプリケーションの場合、この推奨アプリケーション用のIAssocHandler :: GetIconLocationはPNGファイルへのこの奇妙なパスを返します。希望、それは今より明確です。 –