2016-05-24 6 views
0

Bei dem Versuch, "Öffnen mit" -Funktionalität zu implementieren, stieß ich auf ein Problem beim Extrahieren von Symbolen aus UWP-Anwendungen. Also, nach dem Empfang der Liste der empfohlenen Anwendungen, um bestimmte Datei mit Hilfe von SHAssocEnumHandlers zu öffnen, versuche ich, Symbole für jede dieser Anwendungen mit Hilfe von IAssocHandler::GetIconLocation und klassischen zu extrahieren. Alles funktioniert gut mit Programmen wie Paint zum Beispiel. Ich habe den vollständigen Pfad zu Paint binary und kann daraus Icon extrahieren. Aber mit Anwendungen wie "3D-Builder", "Fotos" und anderen UWP-Anwendungen erhalten Symbol Speicherort wie @{Microsoft.Windows.Photos_16.511.8630.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.Windows.Photos/Files/Assets/PhotosAppList.png} aussieht. Ich habe ein paar verschiedene APIs ausprobiert, um das Symbol zu extrahieren, und jedes Mal, wenn der Fehler FILE_NOT_FOUND empfangen wurde. Kann mir jemand einen Hinweis geben, welche Funktion in diesem Fall zum Extrahieren des Icons verwendet werden kann?Extrahieren Symbol von UWP-Anwendung

UPDATE Einige Teile des Quellcodes hinzugefügt, um die Situation zu klären:

// 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

Hmm, ich war mir ziemlich sicher, dass die Standard-API-Funktion "ExtractAssociatedIcon" gut funktionierte. Von Shell32.dll exportiert. Es ist unklar, wo Sie diesen Pfad zu einer PNG-Datei erhalten. Was meinst du damit, wenn du sagst, dass die Position eines erhaltenen Symbols aussieht? Von wo erhalten? ExtractIcon und ExtractAssociatedIcon geben HICONs zurück, keine Strings oder Pfade. Den Code zu veröffentlichen, den du versuchst, wäre ein guter Anfang. –

+0

@CodyGray danke für deinen Kommentar. Code hinzugefügt, um die Situation zu klären. Was ich versuche, ist, die Liste der empfohlenen Anwendungen zu erhalten, um zum Beispiel die * .jpg-Datei zu öffnen. Nachdem ich die Liste der empfohlenen Anwendungen bekommen habe, möchte ich sie im "Öffnen mit" -Kontextmenü mit ihren Symbolen auf der linken Seite zeigen (so ziemlich wie Windows Explorer funktioniert). Wenn also die empfohlene Anwendung die UWP-Anwendung ist, gibt IAssocHandler :: GetIconLocation für diese empfohlene Anwendung diesen seltsamen Pfad zur PNG-Datei zurück. Hoffe, es ist jetzt klarer. –

Antwort

4

Sieht aus wie ich die Lösung gefunden habe. Der Symbolpfad für die UWP-Anwendung wird gemäß MSDN als "indirekte Zeichenfolge" bezeichnet. Wir können diese indirekte Zeichenfolge an die Funktion übergeben und erhalten den regulären vollständigen Pfad zur PNG-Datei des Symbols. In meinem Fall nach der Übergabe @{Microsoft.Windows.Photos_16.511.8630.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.Windows.Photos/Files/Assets/PhotosAppList.png} an SHLoadIndirectString() Ich erhielt Pfad wie folgt: C:\Program Files\WindowsApps\Microsoft.Windows.Photos_16.511.8630.0_neutral_split.scale-125_8wekyb3d8bbwe\Assets\PhotosAppList.scale-125.png und danach kann ich es verwenden, um das Symbol selbst ohne irgendein Problem anzuzeigen.

+0

Danke. SHLoadIndirectString Funktion half mir Icon für Windows Store-Anwendung zu retrollen. – Boogier