Diese Frage steht im Zusammenhang mit einer früheren Frage: „Warum schlägt das Ändern der Thread-Sprache und zurück für bekannte Ordner fehl?“ "
Die meisten Dateitexteigenschaften sind lesbar und werden von der aktuellen Thread-Sprache nicht beeinflusst. Einige sind jedoch schreibgeschützt und werden von der Sprache beeinflusst. Der Dateiname bekannter Ordner und die Shell-Elementtypen PKEY_ItemType und PKEY_ItemTypeText sind drei solcher Eigenschaften. Bei über 1000 Eigenschaften gibt es wahrscheinlich noch weitere.
Auf meinem PC sind Englisch und Thailändisch installiert. Englisch ist die aktuelle PC-Sprache.
Beim Ändern der Thread-Sprache stelle ich fest, dass das Abrufen von Eigenschaftswerten nicht korrekt funktioniert.
Ein Aufruf von IPropertyStore ::GetValue() gibt manchmal Text in der richtigen Sprache zurück und manchmal nicht.
Ich würde gerne IPropertyStore::GetValue() oder eine Alternative verwenden , um den Text im aktuellen Thread abzurufen Sprache.
Ich füge ein funktionierendes Konsolenprogramm bei, das das Problem zeigt.
Code: Select all
#include
#include
#include
#include
void ShowProperty(const WCHAR *pczDesc, LPITEMIDLIST pidlItem, const PROPERTYKEY& infoKey)
{
IPropertyStore *pIStore;
PROPVARIANT propValue;
if(SHGetPropertyStoreFromIDList(pidlItem, GPS_DEFAULT, IID_IPropertyStore, (void **)&pIStore) == S_OK)
{
PropVariantInit(&propValue);
if(pIStore->GetValue(infoKey, &propValue) == S_OK)
{
wprintf(L"%s\n", pczDesc, propValue.bstrVal);
PropVariantClear(&propValue);
}
if(pIStore != NULL)
{
pIStore->Release();
}
}
}
int main()
{
LANGID nLangPC;
LANGID nLang2;
LPITEMIDLIST pidlSystem32;
LPITEMIDLIST pidlKnownFolder;
CoInitialize(nullptr);
nLang2 = 0x041E; // Thai
nLangPC = GetThreadUILanguage();
if((pidlSystem32 = ILCreateFromPath(L"C:\\Windows\\System32")) != NULL)
{
if(SHGetKnownFolderIDList(FOLDERID_Music, KF_FLAG_DEFAULT, NULL, &pidlKnownFolder) == S_OK)
{
wprintf(L"\n------- 0x%04X ------------\n", nLang2);
SetThreadUILanguage(nLang2);
ShowProperty(L"System32 folder name: ", pidlSystem32, PKEY_ItemNameDisplay);
ShowProperty(L"System32 folder type: ", pidlSystem32, PKEY_ItemType);
ShowProperty(L"System32 folder type text: ", pidlSystem32, PKEY_ItemTypeText);
ShowProperty(L"Known folder name: ", pidlKnownFolder, PKEY_ItemNameDisplay);
ShowProperty(L"Known folder type: ", pidlKnownFolder, PKEY_ItemType);
ShowProperty(L"Known folder type text: ", pidlKnownFolder, PKEY_ItemTypeText);
wprintf(L"\n------- 0x%04X ------------\n", nLangPC);
SetThreadUILanguage(nLangPC);
ShowProperty(L"System32 folder name: ", pidlSystem32, PKEY_ItemNameDisplay);
ShowProperty(L"System32 folder type: ", pidlSystem32, PKEY_ItemType);
ShowProperty(L"System32 folder type text: ", pidlSystem32, PKEY_ItemTypeText);
ShowProperty(L"Known folder name: ", pidlKnownFolder, PKEY_ItemNameDisplay);
ShowProperty(L"Known folder type: ", pidlKnownFolder, PKEY_ItemType);
ShowProperty(L"Known folder type text: ", pidlKnownFolder, PKEY_ItemTypeText);
ILFree(pidlKnownFolder);
}
ILFree(pidlSystem32);
}
CoUninitialize();
return 0;
}
Code: Select all
------- 0x041E ------------
System32 folder name: - Correct
System32 folder type: - Wrong
System32 folder type text: - Correct
Known folder name: - Correct
Known folder type: - Wrong
Known folder type text: - Correct
------- 0x0809 ------------
System32 folder name: - Correct
System32 folder type: - Correct
System32 folder type text: - Wrong
Known folder name: - Wrong
Known folder type: - Correct
Known folder type text: - Correct