2009-05-06 11 views
6

Estoy intentando compilar un protector de pantalla utilizando Visual C++ 2008 Express Edition SP1 en Windows XP. Aparece un error de tiempo de ejecución: "No se pudo ubicar el punto de entrada de procedimiento ChangeWindowMessageFilter() en la biblioteca de enlace dinámico USER32.dll". Por lo que puedo decir, esto se debe a que Microsoft ha estropeado la biblioteca scrnsave.lib incluida en VS 2008 para llamar a una función específica de Vista, que falla en XP porque la función no existe.La construcción de un protector de pantalla para Windows XP utilizando VC++ 2008

Definición WINVER no parece hacer nada.

¿Cómo puedo evitar esto?

+0

@james_block: Mantenga un ojo en esta pregunta ... que será de ayuda para usted ... http://stackoverflow.com/questions/2300817/using-multiple-versions-of-the-windows-platform -sdk-with-vs-2008-professional – t0mm13b

Respuesta

0

Usted podría intentar conseguir una versión anterior del SDK de la plataforma, y ​​el enlace a su versión de ScrnSave.lib.

http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en es el enlace de descarga para Windows Server 2003 SP1 SDK de la plataforma.

+0

Tenía la esperanza de evitar la descarga e instalación de un antiguo SDK completo solo para un archivo, pero a menos que alguien pueda encontrar una mejor opción, es posible que deba hacer esto. –

1

Ver esto en MSDN para 'ChangeWindowMessageFilter' indica que es un Vista Específico y es parte del User32.lib con el que está enlazando, ya que Windows XP no tiene esa función en el User32.dll. ... de ahí la explosión ... recomienda seguir la sugerencia de Michael de descargar una versión anterior del SDK ... no hay otra manera de hacerlo ... Me pregunto si puede instalar un SDK diferente uno al lado del otro, uno para Plataformas Vista y la otra para la plataforma Win XP?

Editar: He encontrado un enlace interesante aquí sobre este aquí en un blog ... Se habla sobre el mismo problema exacto, agarra un viejo ejemplar de ScrnSave.lib desde una instalación anterior (VS 2005 si tiene acceso a uno o pedirle a un amigo/compañero de trabajo) Hablando de la función anterior que es específica Vista - aquí está una interesante opinion en él por lo que no se debe tocar ...

Espero que esto ayude, saludos cordiales, Tom .

+0

No dude en preguntar por aquí a alguien que pueda tener una copia ... – t0mm13b

0

escribir una función de código auxiliar (muchos detalles quedan fuera del código)

BOOL WINAPI ChangeWindowMessageFilter(  
    UINT message, 
    DWORD dwFlag) 
{ 
    if (running_on_vista_or_later) 
    { 
     .... 
     pfn = GetProcAddress(... "ChangeWindowMessageFilter"); 
     return pfn (message, dwFlag); 
    } 

    return TRUE; 
} 

Si el obj o IIb que esta función es en es antes User32.lib en su línea de enlace, a continuación, el enlazador debe escoger su función de código auxiliar en lugar de la de user32.lib.

Su función talón puede detectar en tiempo de ejecución que está en Vista o posterior y llama a la función real, de lo contrario sólo se encuentran y devolver TRUE.

Cuestiones relacionadas