Я использую инструмент Microsoft P / Invoke Interop Assistant для генерации некоторых структур, делегатов и т. Д. Из собственного кода C / C ++.
Примером одного из них является указатель на функцию (делегат), который в управляемом коде разрешает следующие имена:
EnumCalendarInfoProcA
EnumCalendarInfoProcW
EnumCalendarInfoProcExA
EnumCalendarInfoProcExW
Кто-нибудь может объяснить разницу между A и W и ExA и ExW?
Некоторые функции имеют несколько форматов. Либо Ascii (MessageBoxA), либо широкий символ / юникод (MessageBoxW).
Когда функция делает то же самое, но больше, имя обычно получает постфикс «Ex» и, вероятно, означает расширенный.
Как и следующие функции
Окно сообщения:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx
MessageBoxEx:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645507(v=vs.85).aspx
где MessageBoxEx расширяется параметром wLanguageId.
Вы должны быть немного осторожнее с PInvoke Interop Assistant. Создаваемые объявления полностью генерируются автоматически и не редактируются. Это приводит к довольно неловким результатам, вам, по крайней мере, нужно сравнить с отредактированным источником объявлений, таким как доступный на веб-сайте pinvoke.net и в библиотеке MSDN.
Версии A и W существуют, потому что функция управляет строками. Старые версии Windows в ветке 9x не поддерживают Unicode. Они использовали версии A, строки с 8-битными кодированными символами. Это перестало быть актуальным с быстрой и заслуженной кончиной Windows ME. Все версии Windows, с которыми вы когда-либо сталкивались сегодня, происходят из ветки NT, и в ядре они поддерживают Unicode.
Маршаллер pinvoke уже знает, как правильно выбирать между версиями A и W, основываясь на свойстве CharSet в атрибуте [DllImport]. К сожалению, по умолчанию все еще Ansi, большая ошибка, вы всегда должны указывать CharSet.Auto и использовать имя без W. Точное имя на самом деле не имеет значения для EnumCalendarInfoProc, так как это прототип обратного вызова, вы объявляете его как делегат. Вы можете выбрать любое имя.
Разница между EnumCalendarInfoProc и EnumCalendarInfoProcEx хорошо объяснена в статье MSDN, версия Ex имеет дополнительный аргумент. Какой из них вам нужно использовать, определяется функцией API, которую вы используете для начала перечисления. Выберите EnumCalendarInfo () или EnumCalendarInfoEx (). Последний имеет смысл. И обратите внимание на версию ExEx, доступную в Vista и выше. Культура меняется быстрее, чем способность Microsoft создавать Exes;)
Примените CharSet.Auto как к делегату, так и к объявлению функции.