@@ -87,30 +87,66 @@ HRESULT GetDefaultPriFile(winrt::hstring& filePath)
87
87
return GetDefaultPriFileForCurentModule (isPackaged, filePath);
88
88
}
89
89
90
- bool IsWellFormedLanguageTag (const wchar_t * languageTag)
90
+ // Taken from Platform.h/.cpp
91
+ typedef bool (WINAPI* IsWellFormedTagFunc)(PCWSTR);
92
+ HMODULE g_bcp47 = (HMODULE)(-1 );
93
+
94
+ HMODULE LoadBcp47ModuleFrom (_In_ PCWSTR moduleName)
91
95
{
92
- // Implementation taken from Platform.h, without accepting semi-colon, as it must be a single language tag
93
- if (languageTag == nullptr || *languageTag == L ' \0 ' )
96
+ HMODULE module = LoadLibraryExW (moduleName, nullptr , LOAD_LIBRARY_SEARCH_SYSTEM32);
97
+ if (module != nullptr )
94
98
{
95
- return FALSE ;
99
+ // All BCP47 APIs we are interested are always exported from the same dll together. So we just pick anyone for probe.
100
+ IsWellFormedTagFunc func = (IsWellFormedTagFunc)(GetProcAddress (module , " IsWellFormedTag" ));
101
+ if (func != nullptr )
102
+ {
103
+ return module ;
104
+ }
105
+ FreeLibrary (module );
96
106
}
97
107
98
- BOOLEAN ok = TRUE ;
99
- PCWSTR test = languageTag;
108
+ return nullptr ;
109
+ }
100
110
101
- while (ok && (*test != L' \0 ' ))
111
+ HMODULE LoadBcp47Module ()
112
+ {
113
+ HMODULE module = LoadBcp47ModuleFrom (L" bcp47mrm.dll" );
114
+ if (module == nullptr )
102
115
{
103
- // we accept letters, numbers and dash
104
- if (((*test >= L' 0' ) && (*test <= L' 9' )) || ((*test >= L' a' ) && (*test <= L' z' )) || ((*test >= L' A' ) && (*test <= L' Z' )) ||
105
- (*test == L' -' ))
106
- {
107
- test++;
108
- }
109
- else
110
- {
111
- ok = FALSE ;
112
- }
116
+ // In downlevel OS, the API is exposed by bcp47langs.dll.
117
+ module = LoadBcp47ModuleFrom (L" bcp47langs.dll" );
118
+ }
119
+
120
+ return module ;
121
+ }
122
+
123
+ void InitializeBcp47Module ()
124
+ {
125
+ HMODULE comparand = (HMODULE)(-1 );
126
+ if (InterlockedCompareExchangePointer (reinterpret_cast <PVOID*>(&g_bcp47), comparand, comparand) == comparand)
127
+ {
128
+ HMODULE module = LoadBcp47Module ();
129
+ InterlockedExchangePointer (reinterpret_cast <PVOID*>(&g_bcp47), module );
130
+ }
131
+ }
132
+
133
+ BOOLEAN _DefIsWellFormedTag (_In_ PCWSTR tag)
134
+ {
135
+ // Before new SDK is released, we need to use LoadLibrary/GetProcAddress
136
+ InitializeBcp47Module ();
137
+
138
+ if (g_bcp47 == nullptr )
139
+ {
140
+ // Didn't find an implementation. Just return TRUE.
141
+ return TRUE ;
142
+ }
143
+
144
+ IsWellFormedTagFunc func = (IsWellFormedTagFunc)(GetProcAddress (g_bcp47, " IsWellFormedTag" ));
145
+ if (func != nullptr )
146
+ {
147
+ return func (tag);
113
148
}
114
149
115
- return ok && ((test - languageTag) >= 2 );
150
+ // Should not reach here.
151
+ return TRUE ;
116
152
}
0 commit comments