Как я могу вызвать GetWindowLongPtr и SetWindowLongPtr на 32-битных платформах?

Я хочу 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-битных ОС отсутствуют точки входа.

I подозреваемый что истина где-то посередине: когда вы говорите компилятору 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-битной ОС?

Ответы на вопрос(2)

Ваш ответ на вопрос