Вы должны работать с более старой версией SDK. Версия 7.0 объявляет аргументы так:
WinMain (
__in HINSTANCE hInstance,
__in_opt HINSTANCE hPrevInstance,
__in LPSTR lpCmdLine,
__in int nShowCmd
);
Обратите внимание на аннотацию __in_opt, она помечает аргумент как необязательный, указывая, что передача значения NULL является приемлемой. Это ранняя версия аннотаций SAL, аббревиатура от языка аннотаций исходного кода. Для них есть статья MSDN , однако она документирует синтаксис, который используется в файлах #include библиотеки C / C ++. Не совсем уверен, почему группа SDK не использует то же самое, они, как правило, немного медленные, чтобы наверстать упущенное.
За исключением возможности сделать объявления более читабельными, устранить неоднозначность объявлений C, аннотации также полезны для инструментов. Хорошим примером является Code Analyzer, встроенный в более высокие SKU для VS2008 и VS2010 (он улавливает ошибки программирования). И P / Invoke Interop Assistant, инструмент, который генерирует объявления C / или VB.NET p / invoke с использованием базы данных dbase, созданной из аннотированных заголовочных файлов SDK. Аннотации необходимы для создания хороших объявлений C #.
Вы также можете использовать эти аннотации в своем собственном коде, он будет автоматически проверен анализатором кода, если вы это сделаете. Используйте современный синтаксис, описанный в статье MSDN. Я думаю, что необходимый заголовок sal.h добавляется практически к любому исходному файлу, который включает в себя заголовки CRT.