Aggiungo qualche ulteriore dettaglio riguardo questo problema, secondo me discretamente serio, che ho iniziato a esporre nel mio post precedente
Alla fine c’è voluto il supporto PSS di Microsoft. Il problema risiede nel fatto che WM5.0 ha una gestione complessa del registro: per questioni di performance questo viene sempre tenuto in memoria.
Microsoft ha predisposto una chiamata di sistema mediante la quale è possibile chiedere al sistema operativo di serializzare il registro e di renderlo persistente. Questa funzione, teoricamente, dovrebbe essere gestita dall’OEM (il produttore del device: nel mio caso HP) al fine di amministrare correttamente queste fasi, ad esempio per un salvataggio periodico ogni tot minuti o all’accadere di eventi particolari, tipo un soft-reset.
A me sembra logico pensare che prima di un soft-reset, le eventuali modifiche sul registro debbano essere salvate sul filesystem. Per qualche motivo HP non ritiene (almeno in questa versione della rom) che questo sia il caso.
(Nota: è ovvio pensare che l’uso del registro per applicazioni personali non si a del tutto corretto: è inutile appesantirlo per le proprie impostazioni, meglio usare un file config. Anche se a volte è utile poter salvare un’informazione in un posto un po’ più protetto…)
Tornando a noi, al softreset, tutte le modifiche al registry vengono perse!!
Per ovviare a ciò, è possibile chiamare la funzione RegFlushKey che si occupa di forzare la serializzazione. Attenzione, anche a detta di Microsoft, questa funzione potrebbe non fare niente!!! E’ a discrezione del OEM definire la modalità di persistenza del registro, a seconda delle caratteristiche del device.
Riporto il codice che io ho utilizzato e che ho trovato sul newsgroup microsoft.public.dotnet.framework.compactframework su segnalazione di Raffaele Limosani di MS che ringrazio:
[DllImport(“CoreDll.dll”, EntryPoint = “RegFlushKey”, SetLastError = true)]
private static extern uint RegFlushKey(uint hKey);
private void menuRegistry_Click(object sender, EventArgs e)
{
try
{
long reg = RegFlushKey(0x80000002);
if (reg == 0)
MessageBox.Show(“Registro Salvato”);
}
catch (Exception ex)
{
MessageBox.Show(“Errore: “ + System.Runtime.InteropServices.Marshal.GetLastWin32Error().ToString());
}
}
Una volta effettuato le modifiche sul registro, ad esempio a seguito della registrazione di MSMQ, lanciando il RegFlushKey e facendo un soft-reset, il tutto funziona correttamente.
Io su questo piccolo dettaglio ci ho speso quasi tre settimane… Spero sia di aiuto a qualcuno di voi.
Ciao!