2014-09-29 11 views
5

Hiện tại, chúng tôi đang gặp phải sự cố là thành phần bên ngoài (chúng tôi không biết được thành phần nào) được tải khi sử dụng hộp thoại mở/lưu tệp của Windows, một số hệ thống sẽ thay đổi ngôn ngữ của quá trình, có thể bằng cách thực hiện cuộc gọi setlocale(LC_ALL, "").Có thể vô hiệu hóa setlocale() trong một tiến trình không?

Điều này làm rối loạn ứng dụng của chúng tôi, bởi vì nó dựa trên ngôn ngữ chuẩn được thiết lập (không bị thay đổi bởi bất kỳ thành phần nào của chúng tôi trong thời gian chạy). Vì vậy, chúng tôi cần đảm bảo rằng setlocale() không bao giờ có bất kỳ tác dụng nào khi được gọi trong quá trình hoặc chúng tôi cần phát hiện bất cứ khi nào chức năng này được gọi và sau đó đặt lại ngôn ngữ thành miền địa phương "C" mặc định.

Có cách nào để đạt được một trong các mục tiêu này không?

+1

Bạn có thể đặt một breakpoint trên chức năng thư viện - xem https://stackoverflow.com/questions/3080624/debug-break-on-win32-api-functions – sashoalm

+0

@sashoalm Cảm ơn, nhưng tiếc là chúng tôi không thể gỡ lỗi vấn đề này bởi vì nó không xảy ra trên bất kỳ PC phát triển nào. Ngay cả khi nó đã làm và chúng tôi biết thành phần, nó sẽ không thực sự giúp bảo vệ quá trình chống lại những thay đổi đó. – floele

+0

Hãy thử sử dụng tấm bạt lò xo sau đó - https://stackoverflow.com/questions/189725/what-is-a-trampoline-function – sashoalm

Trả lời

2

Đây không thực sự là câu trả lời trực tiếp cho câu hỏi, mà là giải pháp cho vấn đề cơ bản. Hóa ra là một bản cập nhật gần đây để iCloud gây ra vấn đề này, xem bài này ví dụ:

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

Vì vậy, có hai giải pháp, một đổi tên ShellStreams.dll, một trong những khác được gỡ bỏ cài đặt iClould hoàn toàn (nếu nó không vẫn được sử dụng).

Một bảo vệ thực tế mà có thể được sử dụng là làm cho setlocale() chỉ thread-toàn cầu thay vì quá trình toàn cầu:

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE) 

Nó làm việc trong một ứng dụng thử nghiệm đơn giản của chúng ta, nhưng không trong trường hợp thế giới thực (vì vậy không phải là một giải pháp thực tế cho chúng tôi).

Cách đáng tin cậy nhất để giải quyết vấn đề này nếu bạn không thể gỡ bỏ cài đặt iCloud là sử dụng "_l" -functions, mà làm việc sử dụng một miền địa phương cụ thể như thế này:

_locale_t localeInfo = _create_locale(LC_NUMERIC, "C"); 
_sprintf_l(string, format, localeInfo, number); 
_free_locale(localeInfo); 
Các vấn đề liên quan