UWP Windows-10:如何在商店应用程序中使用线程本地存储API

时间:2016-08-05 23:41:44

标签: c++ windows-10-universal c++-cx thread-local-storage wack

我有一个针对Windows-10桌面的C#应用​​程序移动平台。我的应用程序调用用C ++编写的带有c ++ / cx绑定的Windows运行时组件。
我的C ++代码使用线程本地存储api,如 TlsAlloc TlsGetValue ,< strong> TlsSetValue TlsFree 。 当我运行Windows应用认证工具包测试(WACK测试)时,它会在商店应用程序中抱怨这些API不可用。

  

此应用程序不支持kernel32.dll中的API TlsAlloc   类型。 sample.dll调用此API。
由kernel32.dll中的API TlsFree不是   支持此应用程序类型。 sample.dll调用此API。
◦API   此应用程序不支持kernel32.dll中的TlsGetValue   类型。 sample.dll调用此API。
在kernel32.dll中的API TlsSetValue是   此应用程序类型不支持。 sample.dll调用此API。   

对于Windows-10商店应用,我无法看到这些api的替代品。这MSDN page 只讨论这些api在 Windows Phone 8 上的可用性。我无法找到关于 Windows-10

的这些api的任何具体信息

我正在使用 -DWINAPI_FAMILY = WINAPI_FAMILY_APP 标记

编译我的原生C ++库

任何建议都将受到高度赞赏

2 个答案:

答案 0 :(得分:0)

@HansPassant的回答有助于解决这个问题。

UWP Windows-10商店应用程序支持线程本地存储(TLS)API。
我必须升级到Windows SDK版本 10.0.14393.33 在此之前的任何版本都会在TLS api&#39>上出错

答案 1 :(得分:0)

对于Windows 10 Phone UWP应用程序,文档似乎有误。如果链接到kernel32.lib,则可以使用Tls *函数,但是当您尝试部署它时,它会因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);
}
}