2014-09-29 43 views
5

我們目前面臨的問題是,在使用Windows文件打開/保存對話框時,加載的外部組件(我們不知道是哪一個組件)會導致一些系統更改進程的區域設置,可能是撥打電話setlocale(LC_ALL, "")是否可以在進程中禁用setlocale()?

這弄亂了我們的應用程序,因爲它依賴於設置的標準語言環境(在運行時我們自己的任何組件都不會改變它)。

因此,我們需要確保在進程中調用setlocale()時沒有任何影響,或者我們需要檢測何時調用此函數,然後將區域設置重置爲默認的「C」語言環境。

有沒有辦法達到這些目標之一?

+1

你可以把一個斷點庫函數 - 請參閱https://stackoverflow.com/questions/3080624/debug-break-on-win32-api-functions – sashoalm 2014-09-29 14:06:57

+0

@sashoalm謝謝,但不幸的是,我們無法調試此問題,因爲它不會在任何開發PC上發生。即使它確實存在,我們也知道這個組件,但它並不能真正幫助保護這個過程免受這些變化。 – floele 2014-09-29 14:08:59

+0

嘗試使用蹦牀然後 - https://stackoverflow.com/questions/189725/what-is-a-trampoline-function – sashoalm 2014-09-29 14:57:35

回答

2

這不是對問題的直接回答,而是潛在問題的解決方案。原來,最近的一次更新到iCloud造成這個問題,看到這個帖子,例如:

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

因此有兩個解決方案,一個重命名ShellStreams.dll,另一種是完全卸載iClould(如果它不是反正使用)。

可用於正在setlocale()只是線程全局,而不是過程,全球實際的保護:

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE) 

它的工作在我們的一個簡單的測試應用程序,但在現實世界中的情況下(所以不是我們的實際解決方案)。

來解決這個問題,如果你不能卸載的iCloud最可靠的方法是使用「_l」 -functions,它使用一個特定的區域設置這樣的工作:

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