2015-01-15 79 views
1

我將舊版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不支持線程本地存儲,與文檔相反?

+1

你只是看着文件的錯誤部分。 WinRT版本的TlsAlloc()出現在#403行。一個內聯函數,它調用FlsAlloc()。當我嘗試它時,調用它不是問題。只需'#include '就足夠了。 – 2015-01-15 18:19:24

+0

@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

回答

1

是的,它確實如此。複製/從C粘貼:\程序文件(x86)\ Windows Phone的工具包\ 8.1 \包含\的MinWin \ processthreadsapi.h,線#411:

// TlsAlloc, TlsFree, TlsGetValue and TlsSetValue are defined as inlines 
// only for the store apps, not for desktop apps 
#pragma region Application Family 
#if WINAPI_PARTITION_APP && !WINAPI_PARTITION_DESKTOP 

#include <fibersapi.h> 

FORCEINLINE 
_Must_inspect_result_ 
WINBASEAPI 
DWORD 
WINAPI 
TlsAlloc(
    VOID 
    ) 
{ 
    return FlsAlloc(NULL); 
} 
// etc.. 

,你描述的文件是8.0版本的文件。當然不知道這是怎麼發生的。也許你有一個早期測試版,也許你複製文件來解決問題。登陸頁面is here,我沒有下載8.1 Update 1模擬器,但不知道是否也更新了SDK頭文件。

+0

很高興知道我不瘋狂:-)。事實證明,我有Windows 8.1 SDK Update 3,所以Peter Torr建議升級到Update 4應該能夠做到。非常感謝您的有益迴應。 – 2015-01-16 09:56:38

1

這隻會在VS 2013更新4中添加。如果您有更早的安裝(包括更新4 RC),您將不會有更新的標頭。

+0

非常感謝您更新到Update 4的重要提示。這裏有一個重要的經驗教訓:如果文檔指出支持某項功能,請確保您有最新的更新。非常感謝! – 2015-01-16 09:57:53

0

另一種方法是__declspec(線程),它可能更易於使用。它可能映射到相同的功能。