2009-05-06 13 views
6

Sto tentando di compilare uno screensaver utilizzando Visual C++ 2008 Express Edition SP1 su Windows XP. Viene visualizzato un errore di runtime: "Impossibile trovare il punto di immissione della procedura ChangeWindowMessageFilter() nella libreria di collegamento dinamico USER32.dll." Per quanto posso dire, questo è dovuto al fatto che Microsoft ha infettato la libreria scrnsave.lib inclusa in VS 2008 per chiamare una funzione specifica di Vista, che non funziona su XP perché la funzione non esiste.Creazione di un salvaschermo per XP utilizzando VC++ 2008

La definizione di WINVER non sembra fare nulla.

Come posso aggirare questo?

+0

@james_block: tieni d'occhio questa domanda ... ti sarà di aiuto ... http://stackoverflow.com/questions/2300817/using-multiple-versions-of-the-windows-platform -sdk-with-vs-2008-professional – t0mm13b

risposta

0

Si potrebbe provare a ottenere una versione precedente di Platform SDK e il collegamento alla sua versione di scrnsave.lib.

http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en è il collegamento di download per l'SDK di piattaforma Windows Server 2003 SP1.

+0

Speravo di evitare di scaricare e installare un intero SDK precedente solo per un file, ma a meno che qualcuno non riesca a trovare un'opzione migliore, potrei doverlo fare. –

1

Guardando questo in MSDN per 'ChangeWindowMessageFilter' indica che è un specifico Vista e fa parte del User32.lib che è ciò che stai collegando, come Windows XP non ha quella funzione in User32.dll. ... quindi l'esplosione ... raccomandato di seguire il suggerimento di Michael di scaricare una versione precedente dell'SDK ... non c'è altro modo di farlo ... Mi chiedo puoi installare un SDK diverso uno accanto all'altro, uno per Piattaforme Vista e l'altra per la piattaforma Win XP?

Edit: ho trovato un link interessante qui su questo qui su un blog ... Si parla l'esatto problema identico, afferrare una vecchia copia del ScrnSave.lib da un'installazione precedente (VS 2005 se si ha accesso a uno o chiedere ad un amico/collega) Parlando della funzione di cui sopra che è Vista specifica -? ecco un interessante opinion su di esso per cui non dovrebbe essere toccato ...

Spero che questo aiuti, i migliori saluti, Tom.

+0

Sentiti libero di chiedere in giro qui per qualcuno che potrebbe avere una copia ... – t0mm13b

0

Scrivete una funzione stub (molti dettagli lasciati fuori del codice)

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

    return TRUE; 
} 

Se il obj o lib che questa funzione è in è prima di user32.lib nella vostra linea di collegamento, quindi il linker dovrebbe scegliere la vostra funzione di stub piuttosto che quella di user32.lib.

La funzione di stub in grado di rilevare in fase di esecuzione che si è in Vista o successiva e chiamare la funzione reale, altrimenti basta mentire e restituire VERO.

Problemi correlati