2016-08-05 96 views
0

我有一個針對Windows-10桌面的C#應用​​程序&移動平臺。我的應用程序使用C++/cx綁定調用C++編寫的Windows運行時組件。
我的C++代碼使用線程本地存儲API的喜歡TlsAllocTlsGetValueTlsSetValueTlsFree。 當我運行Windows應用程序認證套件測試(WACK測試)時,它會在商店應用程序中抱怨這些api不可用。 UWP Windows-10:如何在商店應用程序中使用線程本地存儲api

◦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++庫-DWINAPI_FAMILY = WINAPI_FAMILY_APP標誌

任何建議將高度讚賞

+0

一定要保持WACK更新,這與每一個變化SDK版本。如果你想要一個乾淨的報告,那麼就像UCRT那樣[使用FlsAlloc代替](http://stackoverflow.com/a/27979758/17034)。 –

+0

Hi @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允許任何UWP應用程序使用TlsAlloc()。這就是爲什麼你需要確保你有最新的WACK。 –

回答

0

@HansPassant答案幫助解決這個問題。

UWP Windows-10 Store應用程序支持線程本地存儲(TLS)api。
我不得不升級到Windows SDK版本10.0.14393.33
任何版本在此之前,就會因錯誤的TLS API的

0

對於Windows 10電話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); 
} 
} 
相關問題