Como pinvoke para GetWindowLongPtr e SetWindowLongPtr em plataformas de 32 bits?

Quero P / Invocar paraGetWindowLongPtr eSetWindowLongPtr, e estou vendo informações conflitantes sobre eles.

Algumas fontes dizem que, em plataformas de 32 bits, GetWindowLongPtr é apenas uma macro de pré-processador que chama GetWindowLong e GetWindowLongPtr não existe como ponto de entrada no user32.dll. Por exemplo:

oentrada pinvoke.net para SetWindowLongPtr possui um método estático que verifica IntPtr.Size e, em seguida, chama SetWindowLong ou SetWindowLongPtr, com um comentário dizendo que "sistemas operacionais herdados não oferecem suporte a SetWindowLongPtr". Não há explicação sobre o significado de "sistemas operacionais herdados".Aresposta no StackOverflow afirma "Em sistemas de 32 bits, GetWindowLongPtr é apenas uma macro C que aponta para GetWindowLong".

Portanto, essas fontes parecem indicar que os pontos de entrada * Ptr simplesmente não existem na versão do user32.dll que acompanha o Windows 7 de 32 bits, por exemplo.

Mas não vejo indicação disso na documentação do MSDN. De acordo com o MSDN,SetWindowLongPtr substitui SetWindowLong, puro e simples. E de acordo com a seção de requisitos doPágina SetWindowLongPtr, parece que SetWindowLongPtr está no user32.dll desde o Windows 2000 (edições de cliente e servidor). Novamente, nenhuma menção aos pontos de entrada faltando nos sistemas operacionais de 32 bits.

I suspeito que a verdade está em algum lugar intermediário: quando você diz ao compilador C ++ para direcionar sistemas operacionais mais antigos (ou seja, para compilar algo que será executado no Win9x e NT4), os arquivos de cabeçalho declaram SetWindowLongPtr como uma macro que chama SetWindowLong, mas a entrada O ponto provavelmente existe no Windows 2000 e posterior e você o obtém diretamente (em vez da macro) se você instruir o compilador a segmentar essas plataformas. Mas isso é apenas um palpite; Eu realmente não tenho os recursos ou o know-how para cavar e verificar isso.

Também é possível que a plataforma de destino tenha um papel importante: se você compilar seu aplicativo para a plataforma x86, não deverá chamar SetWindowLongPtr em um sistema operacional de 64 bits. Novamente, sei o suficiente para pensar na pergunta, mas não sei como encontrar a resposta. O MSDN parece sugerir que SetWindowLongPtr está sempre correto.

Alguém pode me dizer se é seguro simplesmente P / Invoke to SetWindowLongPtr e terminar com isso? (Suponha que o Windows 2000 e posterior.) P / Invocar para SetWindowLongPtr me forneceria o ponto de entrada correto:

se eu executar um aplicativo direcionado à plataforma x86 em um sistema operacional de 32 bits?se eu executar um aplicativo direcionado à plataforma x86 em um sistema operacional de 64 bits?se eu executar um aplicativo segmentado para a plataforma x64 em um sistema operacional de 64 bits?

questionAnswers(2)

yourAnswerToTheQuestion