Элемент управления ActiveX - языковой стандарт MFC

У меня есть приложение MFC, разработанное с помощью Visual Studio 2008, в котором я использую элемент управления Adobe ActiveX (у меня установлен Adobe Reader X). Я пытаюсь установить прямоугольник масштабирования с помощью функции setViewRect, и она отлично работает.

Теперь проблема возникает, когда в моих региональных настройках Windows десятичный символ установлен на запятую вместо точки (например, в региональных настройках для Германии). Параметры прямоугольника масштабирования кажутся неверно интерпретированными.

Я использовал ProcessMonitor и обнаружил, что когда создается элемент управления Adobe ActiveX и его DLL загружается в мой процесс, он вызывает setlocale, и, следовательно, приложение использует текущие региональные настройки Windows вместо языкового стандарта «C» по умолчанию. Поэтому приложение неправильно интерпретирует числа.

Я попытался сбросить языковой стандарт на «C» сразу после загрузки Adobe, и этот обходной путь устранил проблему.

Теперь проблема возникла снова, когда я перенес свое приложение в Visual Studio 2010. Очевидно, Adobe DLL («c: \ Program Files (x86) \ Common Files \ Adobe \ Acrobat \ ActiveX \ AcroPDF.dll») разработана с использованием Visual Studio 2008. Таким образом, когда он устанавливает языковой стандарт, это делается в MSVCR90.dll. Когда я сбрасывал локаль, я делал это с помощью той же библиотеки DLL.

Теперь, когда мое приложение находится в VS2010, вызов setlocale выполняется в MSVCR100.dll, поэтому он не влияет на локаль, уже установленную в MSVCR90.dll.

Есть ли способ установить языковой стандарт COM-объекта, который я размещаю в своем приложении?

Огромное спасибо заранее :)


person dood    schedule 21.07.2012    source источник


Ответы (1)


Это просто снимок в темноте, но вы можете попробовать загрузить MSVCR90.dll с помощью LoadLibrary (поскольку DLL уже загружена, она просто даст вам РУЧКУ, она не загрузится дважды), а затем найти указатель на его функцию setlocale с GetProcAddress. После этого вы сможете вызвать функцию setlocale для этой библиотеки DLL. Это ужасный прием, но он может сработать.

person sashoalm    schedule 25.07.2012
comment
Спасибо за ваш ответ :) Я пытался это сделать, но, к сожалению, LoadLibrary (_T (MSVCR90.dll)) возвращает нулевой дескриптор. Он работает только тогда, когда я загружаю библиотеку с полным путем к MSVCR90.dll (C: \\ Windows \\ winsxs \\ x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_50934f2ebcb7eb57 \\ msvcr90.dll не подходит для. Feb57 \\ msvcr90.dll). - person dood; 25.07.2012
comment
Да, это так :) Спасибо за подсказку :) Я просто не могу использовать полный путь в моем приложении. - person dood; 25.07.2012
comment
См. EnumProcessModulesEx и GetModuleFileName. Я нашел их, просто выполнив поиск DLL процесса перечисления и получив имя файла модуля. Если не искать пути, то не найдешь. Вы не должны так легко сдаваться. - person sashoalm; 26.07.2012