Applicazioni compatibili con Windows 7

Sembra che molti stessero aspettando impazientemente l’arrivo di Windows 7 per iniziare a fare le migrazioni dei propri applicativi sul nuovo sistema operativo, saltando a piè pari Windows Vista. Thinking

E’ stato rilasciato recentemente, dopo il rilascio ufficiale di Windows 7 l’ultima versionde del

“Windows 7 and Windows Server 2008 R2 Application Quality Cookbook”.

E’ disponibile in due versioni:
WEB, https://msdn.microsoft.com/en-us/library/dd371778(VS.85).aspx,
e doc, https://code.msdn.microsoft.com/Windows7AppQuality/Release/ProjectReleases.aspx?ReleaseId=1734.

La guida contiene importanti informazioni riguardanti le modifiche apportate al sistema operativo, di cui gli sviluppatori devono necessariamente tenere conto per poter scrivere codice che si integri alla perfezione con quello, e che possa eventualmente fregiarsi del Logo “Compatible with Windows 7”.

Il documento dalle ultime versioni beta ha subito delle modifiche, "piccole", ma sostanziali in alcune aree. Modifiche dette in gergo "breaking changes".

Una cosa che mi è accaduta recentemente e che mi è già servita diverse volte a spiegare un certo fenomeno è questa: nel file manifest, esiste ora la possibilità di affermare che la nostra applicazione è “Compatibile” con Windows 7.

Tra il documento in versione beta e quello definitivo c’è però una piccola differenza, che se ci si dimentica di aggiornare, ci causerà poi dei problemi.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
      <application> 
        <!--The ID below indicates application support for Windows Vista –>
          <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
        <!--The ID below indicates application support for Windows 7 –>
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
      </application> 
    </compatibility>
  </assembly>

Se aggiungiamo queste poche righe al manifest della nostra applicazione, noi esplicitamente diciamo al sistema operativo che la nostra applicazione è compatibile con Vista e con Windows 7. In questo modo, il Program Compatibility Assistant, non verrà utilizzato, e non verranno applicate “shim” alla nostra applicazione. Questo perchè noi stiamo esplicitamente dicendo che abbiamo seguito tutte le regole di buona programmazione contenute nell’Application Quality Cookbook, e che quindi non abbiamo bisogno dell’aiuto del sistema per ovviare a qualche possibile piccolo problema della nostra applicazione.

C’è però un piccolo inghippo come dicevamo prima.

Chi ha sviluppato durante la fase di beta di Windows 7, e seguito le regole dell’Application Quality Cookbook distribuito all'epoca, si troverà una sorpresa che arriverà nella forma di questa dialog del PCA:

PCA

Quando il vostro programma termina, o, se è un programma di setup, semplicemente annullando l’installazione, vedrete apparire la dialog del PCA, che chiede se l’applicazione ha funzionato correttamente o se volete provare a reinstallarla per risolvere i probelmi che ha incontrato. L’applicazione molto probabilmente ha funzionato regolarmente senza il minimo problema, in quanto voi avevate già seguito il “cookbook”, e quindi l’applicazione è pronta per Windows 7, ma nonostante tutto è arrivato questo messaggio.

Cosa è successo?

E’ successo che tra la beta e la versione rilasciata di Windows 7 c’è stata una “breaking change” che ha cambiato il nome della sezione del file manifest che fa riferimento alle informazioni di compatibilità.

Durante la beta, la sezione si chiamava “compatibilityInfo”, ora è diventata semplicemente “compatibility”.

Questo era un manifest funzionante durante la beta, che però ora causa l’apparire della dialog del PCA.

<compatibilityInfo xmlns="urn:schemas-microsoft-com:compatibility.v1">
  <application>
    <supportedOS id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
  </application>
</compatibilityInfo>

Quindi, chiunque avesse creato il manifest della propria applicazione durante il periodo della beta di Windows 7, usando le informazioni del cookbook, potenzialmente si potrebbe trovare di fronte a spiacevoli sorprese.

Troubleshooting

In Windows 7 ci sono moltissime novità. Una di queste è il nuovo Resource Monitor.

Basta lanciare il Task Manager, andare nella tab Performance, e si trova il pulsante per avviare il Resource Monitor.

Aprendo il Resource Monitor, noterete in alto a destra (o potete aggiungere se non è visualizzata), una nuova colonna che prima non esisteva: Operating System Context.

ResMon 
Se notate che il vostro programma, che contiene nel manifest l’indicazione di compatibilità per Windows 7, sta girando invece come Windows Vista, oltre al fatto che ovviamente vi appare la finestrella del PCA, è chiaro sintomo che c’è qualcosa che non va, perchè se il programma è manifestato per Windows 7, ma il sistema lo carica in un contesto di Vista, vuol dire che qualche “shim” è stata applicata, e quindi abbiamo un problema.

Per prima cosa, quindi controllate che non abbiate usato “compatibilityInfo”, nvece di “compatibility”. Se è così, molto probabilmente sarete nella condizione descritta qua sopra, in quanto per il sistema, il manifest è sbagliato.

Per verificare se e quali “shim” sono state applicate al Vostro programma, aprite Regedit e controllate le seguenti chiavi:

HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

Nei sistemi Operativi a 64 bit anche:
HKCU\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

Lì potreste trovare una chiave con il nome completo di percorso della applicazione a cui è applicata la shim, ad esempio:
C:\Users\…\Debug\VLCTester.exe
il cui valore sarà impostato ad una shim specifica, esempio “DISABLEUSERCALLBACKEXCEPTION”

Se una “shim” è applicata al Vostro programma, qualcosa è andato male nel manifest o nel programma stesso..

Alla prossima!

Mario Raccagni
Senior Support Engineer
Platform Development Support Team