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;
}