У меня есть приложение C #, ориентированное на рабочий стол Windows-10 & Мобильные платформы. Мое приложение вызывает компонент среды выполнения Windows, написанный на C ++ с привязками c ++ / cx.
Мой код C ++ использует API-интерфейсы Thread Local Storage как TlsAlloc, TlsGetValue, TlsSetValue а также TlsFree.
Когда я запускаю тесты Windows App Certification Kit (WACK-тесты), он жалуется на недоступность этих API в приложениях магазина.
◦API TlsAlloc в kernel32.dll не поддерживается для этого приложения
тип. sample.dll вызывает этот API.
◦API TlsFree в kernel32.dll не является
поддерживается для этого типа приложения. sample.dll вызывает этот API.
◦API
TlsGetValue в kernel32.dll не поддерживается для этого приложения
тип. sample.dll вызывает этот API.
◦API TlsSetValue в kernel32.dll является
не поддерживается для этого типа приложения. sample.dll вызывает этот API.
Я не мог найти альтернативы для этих API для приложений магазина Windows-10. это Страница MSDN
говорит только о доступности этих API на Windows Phone 8. Я не мог найти какую-либо конкретную информацию относительно этих API для Окна-10
Я собираю свои родные библиотеки C ++, используя -DWINAPI_FAMILY = WINAPI_FAMILY_APP флаг
Любые предложения будут высоко оценены
Ответ @HansPassant помог понять это.
API-интерфейсы Thread Local Storage (TLS) поддерживаются в приложениях UWP Windows-10 Store.
Мне пришлось обновить до версии Windows SDK 10.0.14393.33
Любая версия до этого будет ошибка на API TLS
Для приложений Windows 10 Phone UWP документация выглядит неправильно. Вы можете использовать функции Tls *, если вы ссылаетесь на kernel32.lib, но при попытке развернуть его происходит сбой с отсутствующей ошибкой DLL.
Вместо этого, если вы ссылаетесь на существующий код, использующий TLS, вы можете использовать следующую эмуляцию (поместите ее в любое место кода):
extern "C" {
DWORD WINAPI __imp_TlsAlloc() {
return FlsAlloc(nullptr);
}
BOOL WINAPI __imp_TlsFree(DWORD index) {
return FlsFree(index);
}
BOOL WINAPI __imp_TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) {
return FlsSetValue(dwTlsIndex, lpTlsValue);
}
LPVOID WINAPI __imp_TlsGetValue(DWORD dwTlsIndex) {
return FlsGetValue(dwTlsIndex);
}
}