Как заставить Ws2_32.lib работать с проектом VS 2013, ориентированным на Windows 8.1

Итак, у меня есть решение Visual Studio 2013 Update 4 с двумя проектами внутри: один целевой Windows 8.1, другой Windows Phone 8.1, настроенный для создания статической библиотеки.

Проект с открытым исходным кодом, поэтому вот решение для справки: https://github.com/gideros/gideros/tree/master/winrt

Что мне нужно сделать, так это заставить его использовать сетевой код, который использует винсокеты. Поскольку это библиотечный проект, в свойствах проекта не было раздела Linker, поэтому я просто включил

#include <WinSock2.h>
#pragma comment(lib, "Ws2_32.lib")

Оба проекта построены без ошибок, и когда библиотека была включена в приложение Windows Phone, она работала именно так, как ожидалось, но в приложении Windows сетевая часть не работала, но также не было ошибок или сбоев.

Я прогнал его через программу сертификации приложений, и он сказал:

Error Found: The supported APIs test detected the following errors:
API WSACleanup in ws2_32.dll is not supported for this application type. 

и множество других ссылок на библиотеку ws2_32

Я начал искать в Интернете, и было много сообщений о том, что вы не можете использовать winsocket в Windows 8.1, вы должны использовать реализацию сокета winrt от Microsoft и т. д.

Но затем я наткнулся на этот блог, в котором сообщалось, что теперь (начиная с VS 2013 Update 3) можно использовать winsock как в Windows 8.1, так и в Windows Phone 8.1.

http://blogs.windows.com/buildingapps/2014/10/13/winsock-and-more-open-source-for-your-windows-store-apps/

Цитата:

Мы рады сообщить, что, начиная с выпуска Visual Studio 2013 Update 3 (скачать) в августе, комплект сертификации приложений Windows (WACK) позволяет использовать API-интерфейсы WinSock в ваших приложениях Магазина Windows. А так как WinSock уже разрешили пройти сертификацию на Windows Phone, эта работа завершает рассказ. Теперь WinSock доступен повсеместно в Windows 8.1, Windows Phone 8.1 и универсальных приложениях.

Поскольку у меня был VS 2013 Update 4, он уже должен был работать. Поэтому я проверил версию сертификации приложения (она была 3.3) и сообщил, что доступно обновление, поэтому я загрузил Windows SDK для Windows 8.1 с:

https://dev.windows.com/en-us/develop/app-certification-kit

И теперь я даже не могу собрать проект, потому что он говорит, что все части Ws2_32.lib отсутствуют для цели Windows 8.1. (в то время как Windows Phone 8.1 все еще собирается и работает как положено)

Так возможно ли вообще использовать винсокеты в приложениях Windows 8.1? И если да, то что мне не хватает?

Обновление 1:

Вроде бы можно, но проблема в моей настройке.

Когда я проверяю файлы заголовков, на которые указывает мой проект, они:

для Windows Phone это

Program Files (x86)/Windows Phone Kits/8.1/Include/winsock2.h

для винды это

Program Files (x86)/Windows Kits/8.1/Include/um/WinSock2.h

И когда я проверяю файл для Windows, в нем определен препроцессор:

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

И это не входит в этот оператор if, поэтому для компилятора этот файл в основном пуст.

Я даже пытался удалить Windows 8.1 SDK, ничего не изменилось.

Затем я вручную удалил файлы из папки Program Files и установил новый из

https://dev.windows.com/en-us/develop/app-certification-kit

все еще у меня есть тот же самый заголовок. Итак, где я могу получить последнюю версию Windows 8.1 SDK с правильным заголовочным файлом winsock2?

Обновление 2:

Поэтому я удалил все и переустановил чистый VS 2013 Express Update 4 и снова тот же результат, все строится без ошибок, но сеть не работает в приложении Windows 8.1, в то время как оно отлично работает на Windows Phone 8.1.

Это похоже на то, что в Windows 8.1 есть только пустые заглушки, которые ничего не делают.

Я спрашивал на форуме разработчиков Windows, и один из представителей Microsoft заявил об этом, цитируя:

Если у вас правильно установлено обновление 4 для VS 2013, вы получите обновленный пакет SDK для Windows 8.1. В этой версии winsock2.h из Магазина Windows исключены только ASCII-версии большинства API-интерфейсов WinSock. Вы должны использовать UNICODE исключительно для приложений Магазина Windows 8.

К сожалению, я понятия не имею, что это значит и как мне быть дальше. Если это означает определение макроса UNICODE, то он уже определен.

Обновление 3:

Мне удалось отладить код winsocket, и там все работает, как и ожидалось, сервер прослушивает порт. Но ничто не может подключиться к нему. Как будто он работает в режиме песочницы

Обновление 4:

Запуск netstat и wireshark, кажется, работает правильно и видит сервер, и я даже могу подключиться к нему с другого компьютера. Но я не могу подключиться с того же компьютера.

И кажется, что MS запрещает приложениям Windows взаимодействовать с настольными приложениями на одном компьютере.

Я понятия не имею, почему, кто-нибудь может дать какие-либо идеи?

Как приложение Metro в Windows 8 может обмениваться данными с базовым настольным приложением на том же компьютере?

Последний вопрос

Если VS 2013 Update 4 объединяет заголовок winsock2, который создается с WACK 3.3, который не разрешает winsockets, в то время как обновление Windows 8.1 SDK имеет WACK3.4, который разрешает API сокетов, но объединяет старый заголовок winsock2, который не собирается.

Как получить WACK3.4 с правильной настройкой winsock2?


person Artūrs Sosins    schedule 18.04.2015    source источник
comment
Проблема в том, что я могу использовать его в приложении для телефона, и он работает, и с сертификацией проблем не было, все разрешено. У меня проблемы с приложением для Windows 8.1, а не с телефонным приложением   -  person Artūrs Sosins    schedule 18.04.2015
comment
Это так, если вы собираетесь отправить его в Магазин Windows, но опять же, это не проблема, проблема в том, что я не могу собрать проект Windows 8.1 с ws2_32.lib, в то время как проект Windows Phone 8.1 работает   -  person Artūrs Sosins    schedule 18.04.2015
comment
Извините, у меня нет информации о таких ограничениях, но он должен хотя бы строиться без ошибок, верно?   -  person Artūrs Sosins    schedule 18.04.2015
comment
Давайте продолжим обсуждение в чате.   -  person Artūrs Sosins    schedule 18.04.2015
comment
WinSock поддерживается в Windows Phone с версии 8.0, а также в Windows 8.1. WACK не подведет вас за использование WinSock.   -  person Peter Torr - MSFT    schedule 18.04.2015


Ответы (2)


WinSock поддерживается в Windows и Windows Phone и разрешен с помощью WACK 3.4. У меня это работает, используя как #pragma comment(lib, "ws2_32.lib"), так и добавляя ws2_32.lib непосредственно в настройки проекта.

Похоже, что-то не так с тем, как вы строите проект после обновления; вы можете опубликовать ошибки, которые вы получили после обновления?

person Peter Torr - MSFT    schedule 18.04.2015
comment
Обычно функции winsock не существуют, хотя winsock2.h был включен. Я открыл файл winsock2.h, и кажется, что он не входит в макрос #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP), поэтому весь файл для компилятора как пустой - person Artūrs Sosins; 19.04.2015
comment
Вероятно, вы берете заголовки из старого SDK. Из какого каталога загружается заголовочный файл? Убедитесь, что ваш проект включает настройки пути. - person Peter Torr - MSFT; 19.04.2015
comment
Хорошо, теперь вы можете строить, вам нужно отладить то, что происходит. Проверяете ли вы возвращаемые значения всех функций WinSock в своем коде? Вы пробовали пройти через отладчик? Есть ли места, где у вас есть #ifdef, которые могут исключать код в Windows? - person Peter Torr - MSFT; 19.04.2015
comment
К сожалению, отладка довольно сложна, как я уже сказал, это решение для статической библиотеки, которая будет использоваться некоторыми другими проектами, есть ли способ отлаживать проекты статической библиотеки в VS? Я попытался отключить JMC и установить Zi для информации об отладке, но я не получаю сгенерированные файлы PDB, а статическая библиотека, похоже, не содержит их сама по себе. Так что я не знаю, как отлаживать такие вещи. Также назовите меня наивным, но я как бы ожидал, что он будет работать из коробки, так как один и тот же код работает для программ Windows Desktop, программ QT и даже Windows Phone, поэтому я все еще думаю, что что-то не так :) - person Artūrs Sosins; 19.04.2015
comment
Еще одна вещь, которая меня смущает, заключается в том, что VS 2013 Update 4 объединяет заголовок winsock2, который создается с WACK 3.3, который не позволяет этого, в то время как обновление Windows 8.1 SDK имеет WACK3.4, который разрешает API сокетов, но объединяет старый заголовок winsock2, который не собирается. Как это имеет смысл? :) - person Artūrs Sosins; 19.04.2015
comment
Хорошо, кажется, что все сокеты действительно работают, только невозможно подключиться с той же машины (что на самом деле было в тестах), я понятия не имею, почему, но похоже, что Microsoft запрещает это. Так что нужно только получить wack 3.4 с правильной настройкой сокета. - person Artūrs Sosins; 19.04.2015

Так что в основном сокеты работают, но есть несколько случаев, о которых нужно знать.

Существует сетевая изоляция, которая не позволяет подключаться к приложениям Магазина Windows с той же машины (как я делал в своих тестах и ​​думал, что сеть не работает).

Но если вы можете подключиться с удаленного компьютера, все работает как положено.

Подробнее об этом:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd374089%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

Но вы все равно не сможете пройти WACK (который не нужен для отправки в магазин, но все же)

Проблема в том, что VS 2013 Update 4 объединяет заголовок winsock2, который собирается и работает, и имеет программное обеспечение WACK 3.3, которое не поддерживает winsockets.

В то время как обновление Windows 8.1 SDK имеет WACK3.4, который разрешает API сокетов, но объединяет старый заголовок winsock2, который не собирается и не работает.

Поскольку вам не нужно запускать WACK для отправки приложения, в основном это не будет проблемой, но поскольку мне нужно было проверить, есть ли какие-либо другие определенные библиотеки, которые я использую, которые могут быть запрещены, мне пришлось установить только одну (сертификация приложений) из Windows 8.1 SDK отсюда:

https://dev.windows.com/en-us/develop/downloads

И теперь у меня есть WACK 3.4 и правильные винсокеты.

Все еще очень плохо с сетевой изоляцией, которая в основном убивает цель того, что я портировал в первую очередь. Делая всю работу в основном напрасной.

person Artūrs Sosins    schedule 19.04.2015
comment
Извините, это не сработало для вас; Я не знаю подробностей, но я считаю, что существует проблема безопасности с петлевыми адресами в приложениях Магазина. Я не видел случая, когда у VS несоответствие SDK/WACK, но тогда на всех моих машинах много хлама :-). На всякий случай пройдусь. - person Peter Torr - MSFT; 19.04.2015