2014-09-29 11 views
5

Attualmente siamo di fronte al problema che un componente esterno (purtroppo non sappiamo quale) venga caricato quando si utilizza la finestra di dialogo di apertura/salvataggio di Windows, alcuni sistemi modificano le impostazioni locali del processo, probabilmente effettuando la chiamata setlocale(LC_ALL, "").È possibile disabilitare setlocale() all'interno di un processo?

Ciò compromette la nostra applicazione, poiché si basa sulla locale standard impostata (che non viene modificata da nessuno dei nostri componenti durante il runtime).

Quindi dobbiamo assicurarci che o setlocale() non abbia mai alcun effetto quando viene chiamato all'interno del processo, o dobbiamo rilevare ogni volta che viene chiamata questa funzione e quindi reimpostare la locale sulla locale predefinita "C".

C'è un modo per raggiungere uno di questi obiettivi?

+1

si può mettere un punto di interruzione funzioni di libreria - vedi https://stackoverflow.com/questions/3080624/debug-break-on-win32-api-functions – sashoalm

+0

@sashoalm Grazie, ma sfortunatamente non possiamo eseguire il debug di questo problema perché non si verifica su alcun PC di sviluppo. Anche se lo facesse e conoscessimo il componente, questo non aiuterebbe molto a proteggere il processo da tali cambiamenti. – floele

+0

Provare a usare un trampolino allora - https://stackoverflow.com/questions/189725/questa-una-trampolina-funzione – sashoalm

risposta

2

Questa non è una risposta diretta alla domanda, ma una soluzione per il problema di fondo. Si è scoperto che un recente aggiornamento di iCloud ha causato questo problema, vedere questo post, ad esempio:

https://discussions.apple.com/thread/5356698

Quindi ci sono due soluzioni, una ridenominazione del ShellStreams.dll, l'altro è di disinstallare iClould completamente (se non lo è usato comunque).

Una protezione reale che potrebbe essere utilizzato sta facendo setlocale() solo filo-globale, invece di processo globale:

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE) 

Ha funzionato in una semplice applicazione di prova del nostro, ma non nel caso reale mondo (quindi non è una soluzione reale per noi).

Il modo più affidabile per risolvere questo problema se non è possibile disinstallare iCloud è quello di utilizzare i -Funzioni "_L", che opera con una versione locale specifica come questo:

_locale_t localeInfo = _create_locale(LC_NUMERIC, "C"); 
_sprintf_l(string, format, localeInfo, number); 
_free_locale(localeInfo); 
Problemi correlati