我將舊版Windows代碼移植到Windows運行時(WinRT),特別是Windows Phone 8.1。該代碼包含對線程本地存儲函數(如TlsAlloc,TlsFree,TlsGetValue和TlsSetValue)的調用。根據MSDN的"Win32 and COM for Windows Runtime apps (system)"頁面,WinRT支持這四種TLS功能。讀TlsAlloc documentation,例如,一曰:WinRT是否支持線程本地存儲功能(Tls *)?
的Windows Phone 8.1:此功能支持Windows Phone應用商店在Windows Phone 8.1或更高版本 應用。當Windows Phone商店應用程序 調用此函數時,它將被內聯調用FlsAlloc替換。 有關功能文檔,請參閱FlsAlloc。
當我#包括指定的頭文件,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) */
. . .
問題爲c學習:WinRT屬於WINAPI_PARTITION_APP的世界,而不是WINAPI_PARTITION_DESKTOP。因此,當我爲WinRT編譯我的應用程序時,我沒有得到任何這些符號和函數聲明。
這只是一個Windows頭問題,MS應該包含WinRT的Tls *函數嗎?或者是WinRT不支持線程本地存儲,與文檔相反?
你只是看着文件的錯誤部分。 WinRT版本的TlsAlloc()出現在#403行。一個內聯函數,它調用FlsAlloc()。當我嘗試它時,調用它不是問題。只需'#include'就足夠了。 –
2015-01-15 18:19:24
@HansPassant我們必須查看不同的頭文件。在我的c:\ Program Files文件(x86)\ Windows Phone Kits \ 8.1 \ Include \ minwin \ processthreadsapi.h的副本中,只有一處出現「TlsAlloc」,並且來自上面引用的部分。 「FlsAlloc」根本不會在文件中出現。行403指向CreateProcessW函數聲明。即使#include -windows.h,VS的Intellisense也不會識別TlsAlloc。我在做什麼錯誤? –
2015-01-16 04:21:13