Я хочу P/Invoke для GetWindowLongPtr и SetWindowLongPtr, и я вижу противоречивую информацию о них .
Некоторые источники говорят, что на 32-разрядных платформах GetWindowLongPtr — это просто макрос препроцессора, который вызывает GetWindowLong, а GetWindowLongPtr не существует в качестве точки входа в user32.dll. Например:
- Запись pinvoke.net для SetWindowLongPtr имеет статический метод, который проверяет IntPtr. Size, а затем вызывает SetWindowLong или SetWindowLongPtr с комментарием о том, что «устаревшие ОС не поддерживают SetWindowLongPtr». Нет никакого объяснения того, что имеется в виду под «старыми операционными системами».
- В ответе на StackOverflow говорится: "В 32-битных системах GetWindowLongPtr - это просто C макрос, указывающий на GetWindowLong".
Таким образом, эти источники указывают на то, что точек входа *Ptr просто нет в версии user32.dll, которая поставляется, скажем, с 32-разрядной Windows 7.
Но я не вижу никаких указаний на это в документации MSDN. Согласно MSDN, SetWindowLongPtr заменяет SetWindowLong, обычный и просто. И в соответствии с разделом требований на странице SetWindowLongPtr. , похоже, что SetWindowLongPtr находится в user32.dll с Windows 2000 (как в клиентской, так и в серверной версиях). Опять же, нет упоминания об отсутствии точек входа в 32-битных ОС.
Я подозреваю, что истина находится где-то посередине: когда вы говорите компилятору C++ ориентироваться на более старые ОС (т. е. компилировать что-то, что будет работать на Win9x и NT4), то файлы заголовков объявляют SetWindowLongPtr как макрос, который вызывает SetWindowLong, но точка входа, вероятно, существует в Windows 2000 и более поздних версиях, и вы получите ее напрямую (вместо макроса), если вы укажете компилятору ориентироваться на эти платформы. Но это всего лишь предположение; У меня действительно нет ресурсов или ноу-хау, чтобы копаться и проверять это.
Также возможно, что целевая платформа играет роль — если вы компилируете приложение для платформы x86, вам не следует вызывать SetWindowLongPtr в 64-разрядной ОС. Опять же, я знаю достаточно, чтобы обдумать вопрос, но не знаю, как найти ответ. MSDN, кажется, предполагает, что SetWindowLongPtr всегда правильный.
Может ли кто-нибудь сказать мне, безопасно ли просто P/Invoke для SetWindowLongPtr и покончить с этим? (Предположим, Windows 2000 и более поздние версии.) Будет ли P/Invoking SetWindowLongPtr давать мне правильную точку входа:
- если я запускаю приложение для платформы x86 в 32-битной ОС?
- если я запускаю приложение для платформы x86 в 64-битной ОС?
- если я запускаю приложение для платформы x64 в 64-битной ОС?