При попытке использовать Visual Studio 2013 для компиляции для Windows XP и POS Ready 2009 в качестве цели я столкнулся с аналогичной проблемой.Приложение скомпилировано нормально со стандартным параметром Visual Studio 2013 (v120)
в свойствах конфигурации Platform Toolset
, однако при изменении значения на Visual Studio 2013 - Windows XP (v120_xp)
для Windows XP я получил ошибку компиляции:
>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\include\winsock2.h(2752): fatal error RC10056:
Переход к местоположениюв файле включения WinSock2.h был показан прототип функции, в котором использовался макрос __out_bcount_part_opt()
.
После просмотра этого сообщения я понял, что эта ошибка была ошибкой компилятора ресурса.Далее я обнаружил, что файл заголовка piflocal.h
, который был включен как в исходный код, так и в файл ресурсов, содержал включение заголовочного файла WinSock2.h
.
Другими словами, источник приложенияКод имел файл заголовка piflocal.h
, который содержал определения, необходимые для файла заголовка resource.h
, используемого файлом ресурсов pif.rc
, а также исходными файлами на языке Си.Для некоторых определений в piflocal.h
требуются определения из стандартного заголовочного файла Microsoft WinSock2.h
, поэтому файл WinSock2.h
был включен в piflocal.h
, сделав его доступным.Однако, когда компилятор ресурсов, как часть извлечения различных заголовочных файлов, попытался обработать файл WinSock2.h
как часть обработки piflocal.h
, он столкнулся с макросом __out_bcount_part_opt()
и завершился неудачей.
Кстати, макрос __out_bcount_part_opt()
является частью аннотаций заголовков, используемых в заголовках Windows .
Аннотации заголовков описывают, как функция использует свои параметры и возвращаемое значение.Эти аннотации были добавлены во многие заголовочные файлы Windows, чтобы помочь вам убедиться в правильности вызова Windows API.Если вы включите анализ кода, который доступен начиная с Visual Studio 2005, компилятор выдаст предупреждения уровня 6000, если вы не вызываете эти функции в соответствии с использованием, описанным в аннотациях.Вы также можете добавить эти аннотации в свой собственный код, чтобы убедиться, что он вызывается правильно.Чтобы включить анализ кода в Visual Studio, см. Документацию для вашей версии Visual Studio.
Эти аннотации определены в Specstrings.h.Они построены на примитивах, которые являются частью стандартного языка аннотаций (SAL) и реализованы с использованием declspec ("SAL *").
Затем я внес необходимые изменения в исходный кодв заголовочные файлы resource.h
и piflocal.h
, чтобы немногие определения, необходимые для pif.rc
из piflocal.h
, были перемещены в resource.h
, а файл заголовка piflocal.h
больше не включался и не извлекался компилятором ресурсов, когдакомпиляция pif.rc
.
При удалении WinSock2.h
из списка файлов заголовков, извлеченных компилятором ресурсов, ошибка больше не возникает.
Я не знаю, почему это скомпилировано сстандартные настройки Visual Studio 2013 и не удалось настроить таргетинг на Windows XP и ее варианты.
Вывод: если вы столкнулись с этой ошибкой или схожей ошибкой, скорее всего, вы включили ее в компилятор ресурсов.файл заголовка с определением макроса, который несовместим с компилятором ресурсов.