L’installazione di MSMQ non resiste al primo softreset su WM 5.0 e ipaq rx1950 – Part II

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!