2014-09-29 27 views
5

Obecnie mamy problem z tym, że komponent zewnętrzny (niestety nie wiemy, który z nich) jest ładowany podczas korzystania z okna otwierania/zapisywania pliku systemu Windows, niektóre systemy zmieniają ustawienia regionalne procesu, prawdopodobnie wykonując wywołanie setlocale(LC_ALL, "").Czy można wyłączyć setlocale() w procesie?

To zakłóca działanie naszej aplikacji, ponieważ opiera się na ustawianiu standardowych ustawień narodowych (które nie są zmieniane przez żaden z naszych własnych komponentów podczas pracy).

Musimy więc upewnić się, że setlocale() nigdy nie zadziała, gdy zostanie wywołane w procesie, lub musimy wykryć za każdym razem, gdy wywoływana jest ta funkcja, a następnie zresetować ustawienia regionalne do domyślnego ustawienia narodowego "C".

Czy istnieje sposób na osiągnięcie jednego z tych celów?

+1

można umieścić punkt przerwania na funkcjach bibliotecznych - zobacz https://stackoverflow.com/questions/3080624/debug-break-on-win32-api-functions – sashoalm

+0

@sashoalm Dzięki, ale niestety nie możemy debugować tego problemu, ponieważ nie dzieje się to na żadnym komputerze programistycznym. Nawet gdyby tak było i znaliśmy ten komponent, nie pomogłoby to w znacznej ochronie procesu przed takimi zmianami. – floele

+0

Spróbuj użyć trampoliny, a następnie - https://stackoverflow.com/questions/189725/what-is-a-trampoline-function – sashoalm

Odpowiedz

2

To nie jest bezpośrednia odpowiedź na to pytanie, ale rozwiązanie podstawowego problemu. Okazało się, że ostatnia aktualizacja iCloud spowodowało ten problem, zobacz ten artykuł na przykład:

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

Tak więc istnieją dwa rozwiązania, jedno zmiany nazwy ShellStreams.dll, drugi jest odinstalowywanie iClould całkowicie (jeśli nie jest to używane w każdym razie).

rzeczywistej ochrony, które mogą być wykorzystane czyni setlocale() właśnie wątku globalny zamiast proces-global:

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE) 

To działało w prostej aplikacji testowej nasza, ale nie w rzeczywistym przypadku światowej (więc nie jest to właściwe rozwiązanie dla nas).

Najbardziej niezawodnym sposobem na rozwiązanie tego problemu, jeśli nie można odinstalować iCloud jest użycie „_l” działanie funkcji, które pracują przy użyciu określonego locale tak:

_locale_t localeInfo = _create_locale(LC_NUMERIC, "C"); 
_sprintf_l(string, format, localeInfo, number); 
_free_locale(localeInfo); 
Powiązane problemy