Използване на Boost с универсално приложение за Windows 10

Разработвам универсално приложение за Windows 10, насочено главно към телефони с Windows. Когато се опитвам да използвам boost, получавам грешки като това:

boost/asio/detail/impl/win_thread.ipp(48): error C2039: 'TerminateThread': is not a member of '`global namespace''

Доколкото разбирам, този проблем възниква поради усилване с помощта на win32 api, който не се поддържа в универсалното приложение на Windows 10. Опитах както 1.58 (текущо официално издание), така и 1.59 (кандидат за издание). Има ли флагове, които пропускам? Имате ли информация, свързана с поддръжката на boost и универсално приложение на Windows?


Създадох минимална програма за възпроизвеждане на тази грешка:

#include <boost/asio.hpp>

int main()
{
    return 0;
}

Всъщност първата грешка, която получавам е:

c:\program files (x86)\windows kits\10\include\10.0.10240.0\um\processthreadsapi.h(491): error C3861: 'FlsAlloc': identifier not found

person MarcinG    schedule 12.08.2015    source източник
comment
докладвайте като грешка и ако не се нуждаете от asio, изключете го от компилацията.   -  person user1095108    schedule 12.08.2015
comment
FlsAlloc е разрешено за приложения на магазина, но TerminateThread не е; това е много опасно. Имате ли нужда от някакви специални флагове за изграждане на съвместимост на Boost с Store? (Съжалявам, че не знам Boost).   -  person Peter Torr - MSFT    schedule 15.08.2015


Отговори (1)


Не всички библиотеки Boost могат да се използват за универсални приложения на Windows. Работата, за да направят повече от тях използваеми с универсални приложения, продължава. Ето още информация: https://blogs.msdn.microsoft.com/vcblog/2014/07/18/using-boost-libraries-in-windows-store-and-phone-applications/

Авторът на публикацията, Стивън Гейтс, има коментари, показващи, че Boost.Asio вероятно използва забранени API. Не мога да направя връзка към отделни коментари, така че частично цитирам тук (подчертаването е мое):

Стивън Гейтс @Li Ning 82: Boost.ASIO зависи от WinSock API, който съвсем наскоро вече е разрешен на Windows Phone 8. Обзалагам се обаче, че ASIO използва други API, които са забранени, че ще трябва да замените.

Освен това CreateThread, CreateThreadPool и т.н. не са налични в универсалните приложения на Windows.

След като казах горното, ще предположа, че ще трябва да използвате нещо различно от Boost.Asio, в което ето малко допълнителна информация, която може да помогне:

Препоръчителният начин за симулиране на многопоточност е използването на Task. Бягай. Можете също да използвате TaskFactory.StartNew.

За попълване, ето списъка с Win32 & COM API за приложения на Windows Runtime. и Алтернативи на Windows API в Windows Runtime приложения.

Надявам се това да помогне.

person Vijay Varadan    schedule 11.02.2016
comment
Марчин пита за C++, но вие предлагате да използвате Task.Run и TaskFactory.StartNew, което не е налично в C++. - person Yuchen; 29.06.2016
comment
@YuchenZhong - това не е съвсем правилно. Когато използвате C++ за създаване на UWP, ще трябва да използвате MS разширения за C++, които ви позволяват да се обадите на .NET библиотеките. Вижте този пример на страницата Task.Run в C++: msdn.microsoft.com/en-us/library/ - person Vijay Varadan; 01.07.2016