2016-08-05 17 views
0

У меня есть приложение C# для таргетинга на Windows-10 Desktop & Мобильные платформы. Мое приложение вызывает компонент Windows Runtime, написанный на C++ с привязками C++/cx.
Мой C++ код использует Thread Local Storage API как TlsAlloc, TlsGetValue, TlsSetValue и TlsFree. Когда я запускаю тесты на сертификацию приложений для Windows (тесты WACK), он жалуется на недоступность этих api в приложении для магазина. UWP Windows-10: Как использовать Thread Local Storage api's в приложениях для хранения

◦API TlsAlloc in kernel32.dll is not supported for this application type. sample.dll calls this API.
◦API TlsFree in kernel32.dll is not supported for this application type. sample.dll calls this API.
◦API TlsGetValue in kernel32.dll is not supported for this application type. sample.dll calls this API.
◦API TlsSetValue in kernel32.dll is not supported for this application type. sample.dll calls this API.

Я не мог видеть альтернативы для этих API-интерфейсов для Windows, 10 магазин приложения. Это MSDN page говорит только об этой доступности api на Windows Phone 8. Я не смог найти какую-либо конкретную информацию об этих API-интерфейсах для для Windows-10

Я компиляция моего родного C LIBS ++ с использованием -DWINAPI_FAMILY = WINAPI_FAMILY_APP флаг

Любые предложения будут высоко оценены

+0

обязательно держать Вак обновляется, это изменилось с каждым SDK. Если вам нужен чистый отчет, тогда [используйте FlsAlloc вместо этого] (http://stackoverflow.com/a/27979758/17034), как это делает UCRT. –

+0

Привет @HansPassant, Спасибо за ответ. Когда вы предлагаете использовать FlsAlloc, это означает, что в моем коде мне нужно изменить все вызовы на TlsAlloc в FlsAlloc или есть макрос, который может сделать этот трюк для меня. На странице [MSDN] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms686801 (v = vs.85) .aspx) говорится, что «** Когда приложение Windows Phone Store вызывает это функция заменяется встроенным вызовом FlsAlloc ** ". Происходит ли эта замена с Windows-10? или это ограничивается только WinPhone-8? –

+0

SDK v10 позволяет использовать TlsAlloc() любым приложением UWP. Именно поэтому вам необходимо убедиться, что у вас есть обновленный WACK. –

ответ

0

@HansPassant ответ помог понять это.

Api's Local Storage (TLS) поддерживается в приложениях UWP для Windows-10.
мне пришлось обновить до Windows SDK версии 10.0.14393.33
Любые версии до этого будет ошибка на TLS API,

0

Для Windows 10 Телефон 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); 
} 
}