2014-09-29 11 views
5

Wir stehen derzeit vor dem Problem, dass eine externe Komponente (wir wissen leider nicht welche) geladen wird, wenn die Windows-Datei öffnen/speichern Dialog ein System ändert das Gebietsschema des Prozesses wahrscheinlich durch den Aufruf setlocale(LC_ALL, "").Ist es möglich, setlocale() innerhalb eines Prozesses zu deaktivieren?

Dies bringt unsere Anwendung durcheinander, weil sie auf dem Standard-Gebietsschema basiert, das gesetzt wird (was während der Laufzeit von keiner unserer eigenen Komponenten geändert wird).

So müssen wir sicherstellen, dass entweder setlocale() nie einen Effekt hat, wenn innerhalb des Prozesses aufgerufen wird, oder wir müssen erkennen, wann diese Funktion aufgerufen wird und dann das Gebietsschema auf das Standard-Gebietsschema "C" zurücksetzen.

Gibt es eine Möglichkeit, eines dieser Ziele zu erreichen?

+1

Sie einen Haltepunkt auf Bibliotheksfunktionen setzen können - siehe https://StackOverflow.com/questions/3080624/debug-break-on-win32-api-functions – sashoalm

+0

@ashoalm Danke, aber leider können wir dieses Problem nicht debuggen, weil es auf keinem Entwicklungs-PC passiert. Selbst wenn dies der Fall wäre und wir die Komponente wüssten, würde es nicht wirklich helfen, den Prozess vor solchen Änderungen zu schützen. – floele

+0

Versuchen Sie es mit einem Trampolin dann - https://stackoverflow.com/questions/189725/what-is-a-trampoline-function – sashoalm

Antwort

2

Dies ist nicht wirklich eine direkte Antwort auf die Frage, sondern eine Lösung für das zugrunde liegende Problem. Es stellte sich heraus, dass ein neues Update zu iCloud dieses Problem verursacht, finden Sie in diesem Beitrag zum Beispiel:

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

So gibt es zwei Lösungen, eine der ShellStreams.dll umbenennen, der andere iClould vollständig ist zu deinstallieren (wenn es nicht ist verwendet sowieso).

einen tatsächlichen Schutz, der verwendet werden könnte, macht setlocale() nur faden global statt prozess global:

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE) 

Es ist in einer einfachen Testanwendung von uns gearbeitet, aber nicht in dem realen Welt Fall (also keine wirkliche Lösung für uns).

Der zuverlässigste Weg, um dieses Problem zu lösen, wenn Sie nicht iCloud deinstallieren kann, ist die „_l“ -Funktionen zu verwenden, die Arbeit einer bestimmten Gebietsschema wie folgt aus:

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