Warum schlägt das Ändern der Thread-Sprache und umgekehrt für bekannte Ordner fehl?C++

Programme in C++. Entwicklerforum
Guest
 Warum schlägt das Ändern der Thread-Sprache und umgekehrt für bekannte Ordner fehl?

Post by Guest »

Ich versuche, sprachspezifischen Text für bekannte Ordner abzurufen.
Vielen Dank für die Antwort auf meinen früheren Beitrag „Wie kann ich Spalteneigenschaftsnamen in verschiedenen Sprachen erhalten?“ Ich verwende SetThreadUILanguage(), um die Sprache auszuwählen und versuche dann, den Gebietsschemanamen für einen bekannten Ordner abzurufen.
Auf meinem PC sind Englisch und Thailändisch installiert. Englisch ist die aktuelle PC-Sprache.
Beim Ändern der Thread-Sprache stelle ich fest, dass für den Eigenschaftsnamen gemäß dem vorherigen Beitrag IPropertyDescription::GetDisplayName() perfekt funktioniert .
Das Abrufen von Eigenschaftswerten funktioniert jedoch nicht ordnungsgemäß.
Ein Aufruf von SHGetFileInfo() funktioniert nach dem ersten Sprachwechsel , aber nicht nach dem zweiten.
Ein Anruf an IPropertyStore::GetValue() gibt nur den PC-Sprachtext zurück.
Möglicherweise gibt es andere Methoden, um den Text abzurufen, aber ich habe keine anderen gefunden.
Ich möchte SHGetFileInfo() oder eine Alternative verwenden, um den Text in der aktuellen Sprache des Threads abzurufen.
Ich füge eine hinzu funktionierendes Konsolenprogramm, das das Problem anzeigt.

Code: Select all

#include 
#include 
#include 
#include 
#include 
#include 

#pragma comment(lib, "Ole32.lib")          // Included libraries here to help build the test program.
#pragma comment(lib, "Propsys.lib")
#pragma comment(lib, "Shell32.lib")

void ShowPropName(const PROPERTYKEY& infoKey)
{
IPropertyDescription   *pIDesc;
WCHAR                  *pczPropName;

if(PSGetPropertyDescription(infoKey, IID_PPV_ARGS(&pIDesc)) == S_OK)
{
pIDesc->GetDisplayName(&pczPropName);

wprintf(L"Property Name \n", pczPropName);

CoTaskMemFree(pczPropName);
pIDesc->Release();
}
}

void ShowItemNameFromFileInfo(REFKNOWNFOLDERID fidFolder)
{
LPITEMIDLIST            pidlFolder;
SHFILEINFO              infoFile;

if(SHGetKnownFolderIDList(fidFolder, 0, NULL, &pidlFolder) == S_OK)
{
if(SHGetFileInfo((LPCTSTR)pidlFolder, 0, &infoFile, sizeof(infoFile), SHGFI_PIDL | SHGFI_DISPLAYNAME) != 0)
{
wprintf(L"Item Name \n", infoFile.szDisplayName);
}

ILFree(pidlFolder);
}
}

void ShowItemNameFromPropStore(const PROPERTYKEY& infoKey, REFKNOWNFOLDERID fidFolder)
{
LPITEMIDLIST            pidlFolder;
IPropertyStore         *pIStore;
PROPVARIANT             propValue;

if(SHGetKnownFolderIDList(fidFolder, 0, NULL, &pidlFolder) == S_OK)
{
if(SHGetPropertyStoreFromIDList(pidlFolder, GPS_DEFAULT, IID_IPropertyStore, (void **)&pIStore) == S_OK)
{
PropVariantInit(&propValue);

if(pIStore->GetValue(infoKey, &propValue) == S_OK)
{
wprintf(L"Item Name \n", propValue.bstrVal);

PropVariantClear(&propValue);
}

if(pIStore != NULL)
{
pIStore->Release();
}
}
}
}

int main()
{
LANGID         nLangPC;
LANGID         nLang2;

CoInitialize(nullptr);

nLang2  = 0x041E;
nLangPC = GetThreadUILanguage();

wprintf(L"\n------- 0x%04X ------------\n", nLang2);

SetThreadUILanguage(nLang2);                                // Set language 2

ShowPropName(PKEY_FileName);                                // Language 2 - Correct

ShowItemNameFromFileInfo(FOLDERID_Music);                   // Language 2 - Correct
ShowItemNameFromPropStore(PKEY_FileName, FOLDERID_Music);   // Language PC - Wrong

wprintf(L"\n------- 0x%04X ------------\n", nLangPC);

SetThreadUILanguage(nLangPC);                               // Set language PC

ShowPropName(PKEY_FileName);                                // Language PC - Correct

ShowItemNameFromFileInfo(FOLDERID_Music);                   // Language 2 - Wrong
ShowItemNameFromPropStore(PKEY_FileName, FOLDERID_Music);   // Language PC - Correct

CoUninitialize();

return 0;
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post