【发布时间】:2015-01-15 17:01:13
【问题描述】:
我正在将旧版 Windows 代码移植到 Windows 运行时 (WinRT),特别是 Windows Phone 8.1。该代码包含对线程本地存储函数(如 TlsAlloc、TlsFree、TlsGetValue 和 TlsSetValue)的调用。根据MSDN的"Win32 and COM for Windows Runtime apps (system)"页面,WinRT下支持这四个TLS功能。以TlsAlloc documentation为例,读一读:
Windows Phone 8.1:Windows Phone Store 支持此功能 Windows Phone 8.1 及更高版本上的应用程序。当一个 Windows Phone Store 应用程序 调用此函数时,它会替换为对 FlsAlloc 的内联调用。 有关函数文档,请参阅 FlsAlloc。
当我在我的旧代码中#include 指示的头文件 Processthreadsapi.h 时,编译失败:
错误 C2039:“TlsAlloc”:不是“全局命名空间”的成员
检查 Processthreadsapi.h 说明为什么它对我没有帮助:
/***********************************************************************************
* *
* processthreadsapi.h -- ApiSet Contract for api-ms-win-core-processthreads-l1 *
* *
* Copyright (c) Microsoft Corporation. All rights reserved. *
* *
***********************************************************************************/
. . .
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
. . .
#ifndef FLS_OUT_OF_INDEXES
#define FLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)
#endif
#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)
_Must_inspect_result_
WINBASEAPI
DWORD
WINAPI
TlsAlloc(
VOID
);
WINBASEAPI
LPVOID
WINAPI
TlsGetValue(
_In_ DWORD dwTlsIndex
);
WINBASEAPI
BOOL
WINAPI
TlsSetValue(
_In_ DWORD dwTlsIndex,
_In_opt_ LPVOID lpTlsValue
);
WINBASEAPI
BOOL
WINAPI
TlsFree(
_In_ DWORD dwTlsIndex
);
. . .
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
. . .
问题很明确:WinRT 属于 WINAPI_PARTITION_APP 的世界,而不是 WINAPI_PARTITION_DESKTOP。因此,当我为 WinRT 编译我的应用程序时,我没有得到任何这些符号和函数声明。
这只是一个 Windows 标头问题,MS 应该在其中包含 WinRT 的 Tls* 函数吗?还是与文档相反,WinRT 不支持线程本地存储?
【问题讨论】:
-
您只是查看了文件的错误部分。 TlsAlloc() 的 WinRT 版本出现在第 #403 行。一个内联函数,它调用 FlsAlloc()。当我尝试它时,调用它也不是问题。只需
#include <Windows.h>即可。 -
@HansPassant 我们必须查看不同的头文件。在我的 c:\Program Files (x86)\Windows Phone Kits\8.1\Include\minwin\processthreadsapi.h 副本中,“TlsAlloc”只有一次出现,这来自我上面引用的部分。文件中根本没有出现“FlsAlloc”。第 403 行指向 CreateProcessW 函数声明。即使#include-ing windows.h,VS 的 Intellisense 也无法识别 TlsAlloc。我做错了什么
?
标签: windows-runtime