2009-12-11 3 views
7

sviluppatore Ogni Windows è fin troppo familiare con un avviso del tipo:Come posso personalizzare "% s ha incontrato un problema e deve chiudere"?

foo.exe ha riscontrato un problema e deve chiudere.

Sono rassegnato alle mie app saltando di tanto in tanto (solo durante lo sviluppo ovviamente), ma quando lo fanno, non voglio vedere "Foo.exe" qui. Voglio vedere un nome "amichevole" come "FooBrowser ™".

Ho cercato la documentazione MSDN alta e bassa per un modo per ignorare questa stringa e non l'ho trovato. E ho condotto molti esperimenti per vedere se potevo incappare nel meccanismo senza fortuna. Tuttavia, quando cerco sul Web "si è verificato un problema e si deve chiudere", vedo un sacco di persone che discutono di istanze precedute da un nome descrittivo e dubito che stiano tutti sostituendo l'intero avviso con il proprio. :-)

ho bisogno di questo per lavorare per le applicazioni Win32 native; .NET non è un'opzione. L'insieme di esempi che vedo discusso sul web include Microsoft Internet Explorer (un'app nativa) e Microsoft Works (che presumo sia ancora un'app nativa anche se sono passate quattro eoni da quando l'ho visto).

Qual è la stretta di mano segreta?

risposta

4

io non so esattamente quale versione di Windows si prendono di mira, ma quelli più recenti cercherò di utilizzare il nome del prodotto amichevole quando si crash.

Assicurarsi di aggiungere una risorsa versione all'eseguibile e fornire un nome prodotto e un nome file amichevoli nella stringa FileDescription.

Questo page su MSDN fornisce ulteriori informazioni.

+0

Ho provato molte stringhe nella risorsa versione e nessuna sembra avere l'effetto desiderato. Inoltre, la stringa "Microsoft Internet Explorer" non appare da nessuna parte nella sua risorsa di versione, tuttavia questa stringa appare nei suoi avvisi di arresto anomalo (secondo il web - non l'ho visto crash ultimamente anch'io). –

+0

Oh, e ho bisogno di supportare XP 32 SP3. Quale delle stringhe di versione ti aspetteresti di utilizzare per il nome "amichevole"? Questa pagina non sembra dire che dovrei aspettarmi che qualcuno di loro funzioni: http://msdn.microsoft.com/en-us/library/ms646987(VS.85).aspx –

+0

Internet Explorer (ciò che appare in finestre di dialogo di arresto) appare sicuramente nella risorsa versione di IE, ho appena dato un'occhiata a questo. Quale sistema operativo stai scegliendo come target e puoi includere lo snippet pertinente dal tuo file .RC. – Michael

0

si fa a non creare un semplice risorsa di stringa che contiene il nome descrittivo della vostra applicazione e l'uso che quando si formatta il messaggio?

Cosa ne pensi?

Spero che questo aiuti, Cordiali saluti, Tom.

+0

Questo messaggio non è pubblicato dalla mia app; è pubblicato da Windows. Il mio codice non ha il controllo. –

+0

@ Pointer Integer: hai provato un collegamento a una scorciatoia per l'applicazione? Mi sto sparando ai piedi con questo e prendendo una lunga sparatoria su ... :( – t0mm13b

+0

Creare un collegamento con un nome descrittivo non aiuta IShellLink supporta una descrizione di collegamento che potrebbe essere utile.È teoricamente possibile che chiedere a Windows Explorer di aprire un collegamento con una descrizione provochi l'uso di alcune interfacce non documentate per impostare il nome descrittivo del processo, ma ne dubito. Potrebbe valere la pena di indagare nonostante il mio dubbio, tranne per il fatto che non ho la possibilità di chiedere a Windows Explorer di avviare i processi seguendo le scorciatoie perché ho già un codice esistente che non posso modificare quali chiamate CreateProcess. –

1

Perché non basta rinominare l'eseguibile dell'applicazione FooBrowser™.exe?

+0

Troppi altri programmi dipendono dal nome file EXE che rimane lo stesso. –

+0

Inoltre, ".exe" è parte del problema. –

1

hmm. Non so se questo è sicuro che cosa lo farà, ma vale la pena provare. Prova a guardare in SetCurrentProcessExplicitAppUserModelID

+0

Sembra estraneo. –

+0

Tale API viene utilizzata per controllare il modo in cui le finestre sono raggruppate sulla barra delle applicazioni (diversi elementi della barra delle applicazioni per Windows dallo stesso processo o un elemento della barra delle applicazioni per più processi.) – Michael

2

mia comprensione è che una volta che l'eccezione bolle fino al sistema operativo, sei fuori di fortuna. Il mio approccio sarebbe quello di prendere l'eccezione prima del che raggiunge il sistema operativo. Nelle mie applicazioni, ho un modulo che mostro quando ho un'eccezione non gestita che consente all'utente di inviare segnalazioni di bug, impedendo al sistema operativo di mostrare il modulo di cui si sta parlando.

Basta una prospettiva diversa :)

+0

SEH __catch è qualcosa che ho riflettuto, quindi grazie per aver confermato che è un approccio praticabile. –

+0

Si noti che è rischioso eseguire codice nel contesto di un processo arrestato. Puoi registrarti con MS per ricevere i dati di crash dalla tua app che gli utenti inviano. – Michael

+0

@ Michael - Forse rischioso, sì. Io codifico per lo più in C# così ho un tentativo ... aggirarmi attorno al mio Application.Run(). Le app non gestite potrebbero essere leggermente diverse. Per quanto riguarda la registrazione con MS ... non ne ero a conoscenza! –

Problemi correlati