>> DR>Вообще-то Excel и прочие настройку разделителя дробной части любят >> брать из системной локали. Не многие юзеры догадаются там ее поменять. >> >> Агащасблин, брать. Офис хр, ставлю разделитель дробной части — точка. >> При обычном запуске ворда все нормально, при запуске его из скрипта или >> в другом виде как активх объект — пишет "неверный формат числа" и >> вываливается. Как бы это помягче сказать, кто они??? _>Есть юзерская локаль (которую ты меняешь), а есть системная, которую тебе нужно тоже поменять, чтобы активхы заработал.
И с этого места подробнее. Вы считаете, что comserver ворда запускается под system? Это не так, запускается из под моего аккаунта. Запускает его, конечно, svchost, но вот профайл она ему грузит мой. В связи с чем возникает вопрос — какого?
AS>>Агащасблин, брать. Офис хр, ставлю разделитель дробной части — точка. При обычном запуске ворда все нормально, при запуске его из скрипта или в другом виде как активх объект — пишет "неверный формат числа" и вываливается. Как бы это помягче сказать, кто они???
DR>Если использовать методы диспинтерфейсов, то локаль принимается, кажется, LOCALE_SYSTEM_DEFAULT (та, что по-умолчанию для потока), что на нерусских виндах даст точку. Если же использовать методы дуальных интерфейсов, то в них есть дополнительный параметр, где можно указать LOCALE_USER_DEFAULT. DR>Можно попробовать указать локаль для потока... SetThreadLocale(LOCALE_USER_DEFAULT)
Она уже:
The system assigns a locale to each thread. Initially, the system assigns the system default locale to the thread. This default locale is set by the user when the system is installed or through Regional Options in Control Panel. If a thread is run in a process belonging to a user, the system assigns the user-default locale to the thread.
Ворд это не inproc сервер, и запускается он под моим аккаунтом... В общем, все глухо. В любом случае, различий имхо быть не должно — например, я не могу банально открыть документ ворда в экслорере, он ругается. Так что "попробовать" указать локаль не выйдет
Andrew S wrote: > И с этого места подробнее. Вы считаете, что comserver ворда запускается > под system? Это не так, запускается из под моего аккаунта. Запускает > его, конечно, svchost, но вот профайл она ему грузит мой. В связи с чем > возникает вопрос — какого?
Локаль назначается на поток (SetThreadLocale). Поток, в котором работает
сервер, запускается из системного аккаунта и на него выставляется локаль
системы.
C>Andrew S wrote: >> И с этого места подробнее. Вы считаете, что comserver ворда запускается >> под system? Это не так, запускается из под моего аккаунта. Запускает >> его, конечно, svchost, но вот профайл она ему грузит мой. В связи с чем >> возникает вопрос — какого? C>Локаль назначается на поток (SetThreadLocale). Поток, в котором работает C>сервер, запускается из системного аккаунта и на него выставляется локаль C>системы.
Я специально смотрел процесс эксплорером, какой там аккаунт у winword.exe Мой, мой, не системный. И выставляться на него должна юзерская локаль, судя по msdn. Скорее всего, там просто явно делается установки системной локали при запуске ворда как com сервера.
Для проверки домыслов специально сделал atl com сервер (exe), который запускается ровно так же — так вот, при запуске просто приложением и из скрипта локали идентичны — 0x419. И системная, и пользовательская. То бишь там то, что мы настраиваем в панели управления. Спрашивается — кагого еще рожна ворду надо?
Здравствуйте, Andrew S, Вы писали:
AS>Она уже: AS>
AS>The system assigns a locale to each thread. Initially, the system assigns the system default locale to the thread. This default locale is set by the user when the system is installed or through Regional Options in Control Panel. If a thread is run in a process belonging to a user, the system assigns the user-default locale to the thread.
AS>Ворд это не inproc сервер, и запускается он под моим аккаунтом... В общем, все глухо. В любом случае, различий имхо быть не должно — например, я не могу банально открыть документ ворда в экслорере, он ругается. Так что "попробовать" указать локаль не выйдет
Regional Settings and Excel COM Calls: Avoiding Run-Time Errors
It is important to keep in mind that some data, such as dates and numbers, can only be displayed correctly to an end user when the user's culture is known. To properly interpret, convert, and present data, you must consider the variety of language versions of Microsoft Office and Microsoft Windows, as well as the end user's ability to set different Windows regional settings. For example, when Excel receives a call through Automation, Excel uses the locale identifier (LCID) supplied by the Automation client to execute the call. Therefore, when you are developing solutions for multiple countries or regions, you should be mindful that the values for string literals, such as "04/08/2003" or "1,000", might be interpreted based upon the locale. If your code is not written to account for such culture-sensitive strings, you might encounter run-time errors or data conversion errors, or display incorrect data.
SUMMARY
When setting the currency format for an Excel range from an out-of-process Automation client, it is necessary to specify an explicit Locale ID (LCID) if the function should operate using a locale different from the operating system. MORE INFORMATION
If you Automate Excel from a remote client using Visual C++, you need to be sure that the LCID for the call is specifically known by Excel.
Most Excel functions take an LCID parameter when early binding. If late binding, the LCID passed to IDispatch::Invoke is used as the LCID parameter for the function being called. If you do not explicitly set the LCID to a valid value, Excel assumes the system default.
For example, if you are developing on a system with an English (United States) operating system and you want the Excel currency setting to show DM for German currency, but you ignore the Locale ID, then Excel formats the result with the dollar sign ($) instead of the German currency (DM). Excel does this even if German has been set under the Regional Settings in Control Panel. This is because an LCID of zero is assumed to be the default locale for the system and not a user. Since the system is English (United States), in this example, the currency is displayed in U.S. Dollars.
Re: Неизвестное о создателях Office 2003
От:
Аноним
Дата:
27.04.06 16:12
Оценка:
По поводу возникшего обсуждения локалей и комсерверов...
Объясните мне, или лучше просто покажите юзера, который это знает
DR>Regional Settings and Excel COM Calls: Avoiding Run-Time Errors
DR>It is important to keep in mind that some data, such as dates and numbers, can only be displayed correctly to an end user when the user's culture is known. To properly interpret, convert, and present data, you must consider the variety of language versions of Microsoft Office and Microsoft Windows, as well as the end user's ability to set different Windows regional settings. For example, when Excel receives a call through Automation, Excel uses the locale identifier (LCID) supplied by the Automation client to execute the call. Therefore, when you are developing solutions for multiple countries or regions, you should be mindful that the values for string literals, such as "04/08/2003" or "1,000", might be interpreted based upon the locale. If your code is not written to account for such culture-sensitive strings, you might encounter run-time errors or data conversion errors, or display incorrect data.
Вот сейчас специально собрал пример в виде exe com server, который выводит текущие user и system локали. Запускаю из скрипта — локаль так же, что и при обычном запуске. Каким образом ворд получает другую локаль, я не могу понять. Откуда он берет "locale identifier (LCID) supplied by the Automation client to execute the call"? RpcImpersonateClient? Но зачем...
Попробовал посмотреть в методах создаваемого объекта — аналогично, все схоже с простым запуском... Это ж как надо извратиться, чтобы все поломать
А>По поводу возникшего обсуждения локалей и комсерверов... А>Объясните мне, или лучше просто покажите юзера, который это знает
Не, ну тут просто уже интересно понять причину. А вообще — как юзеру, мне, например, глубоко наср@ть, что и откуда берет экслель или ворд. Я знаю только то, что если я открываю документ не из ворда, а из IE или еще откуда, что пользует аутоматион ворда, я получаю отлуп. И мне монопенесуальны причины, почему это так и кто виноват (впрочем, виноват m$, поскольку это обе его разработки)
DR>SUMMARY
DR>When setting the currency format for an Excel range from an out-of-process Automation client, it is necessary to specify an explicit Locale ID (LCID) if the function should operate using a locale different from the operating system.
DR>MORE INFORMATION
DR>If you Automate Excel from a remote client using Visual C++, you need to be sure that the LCID for the call is specifically known by Excel.
DR>Most Excel functions take an LCID parameter when early binding. If late binding, the LCID passed to IDispatch::Invoke is used as the LCID parameter for the function being called. If you do not explicitly set the LCID to a valid value, Excel assumes the system default.
DR>For example, if you are developing on a system with an English (United States) operating system and you want the Excel currency setting to show DM for German currency, but you ignore the Locale ID, then Excel formats the result with the dollar sign ($) instead of the German currency (DM). Excel does this even if German has been set under the Regional Settings in Control Panel. This is because an LCID of zero is assumed to be the default locale for the system and not a user. Since the system is English (United States), in this example, the currency is displayed in U.S. Dollars.
У меня GetSystemDefaultLCID и GetUserDefaultLCID возвращают по-любому одинаковые значения, вызовы GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL...) и GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL...) тоже.
Кстати, LOCALE_SYSTEM_DEFAULT не равно нулю. Нулю равно LOCALE_NEUTRAL. Учитывая выделенное, тем, кто пишет подбное, надо отрывать руки, голову и все остальные выступающие органы туловища . Все равно лишнее
Здравствуйте, Andrew S, Вы писали:
AS>Не, ну тут просто уже интересно понять причину. А вообще — как юзеру, мне, например, глубоко наср@ть, что и откуда берет экслель или ворд. Я знаю только то, что если я открываю документ не из ворда, а из IE или еще откуда, что пользует аутоматион ворда, я получаю отлуп. И мне монопенесуальны причины, почему это так и кто виноват (впрочем, виноват m$, поскольку это обе его разработки)
DR>>...This is because an LCID of zero is assumed to be the default locale for the system and not a user...
AS> У меня GetSystemDefaultLCID и GetUserDefaultLCID возвращают по-любому одинаковые значения, вызовы GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL...) и GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL...) тоже. AS>Кстати, LOCALE_SYSTEM_DEFAULT не равно нулю. Нулю равно LOCALE_NEUTRAL. Учитывая выделенное, тем, кто пишет подбное, надо отрывать руки, голову и все остальные выступающие органы туловища . Все равно лишнее
Выделенное означает: "тот программист, который эту фичу реализовывал, думал, что оно работает именно так..."
Andrew S wrote: > C>Локаль назначается на поток (SetThreadLocale). Поток, в котором работает > C>сервер, запускается из системного аккаунта и на него выставляется локаль > C>системы. > Я специально смотрел процесс эксплорером, какой там аккаунт у > winword.exe Мой, мой, не системный. И выставляться на него должна > юзерская локаль, судя по msdn.
Хм... Запускается он из системного процесса, может локалью он с него
заражается?
C>Andrew S wrote: >> C>Локаль назначается на поток (SetThreadLocale). Поток, в котором работает >> C>сервер, запускается из системного аккаунта и на него выставляется локаль >> C>системы. >> Я специально смотрел процесс эксплорером, какой там аккаунт у >> winword.exe Мой, мой, не системный. И выставляться на него должна >> юзерская локаль, судя по msdn. C>Хм... Запускается он из системного процесса, может локалью он с него C>заражается?
Не прикидывайтесь баннером Я же явно написал, что сделал тестовый com server, который запускается аналогично ворду и там все работает нормально (т.е. svchost все делает максимально правильно — загружает профайл и запускает процесс под нужным пользователем).
Решил посмотреть, что там с Invoke. Все потоки выполняются с 419-й локалью, а в Invoke попадает 409-я (English). Там разделитель всегда точка.
Скорее всего, ворд тупо устанавливает текущую локаль на то, что передается в Invoke. Но откуда она вызывается — ведь никаких методов не надо, просто из скрипта пишем CreateObject("Word.Application") и уже прилетает птица обломинго... В общем, я не понимаю, что откуда
DR>>>...This is because an LCID of zero is assumed to be the default locale for the system and not a user...
AS>> У меня GetSystemDefaultLCID и GetUserDefaultLCID возвращают по-любому одинаковые значения, вызовы GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL...) и GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL...) тоже. AS>>Кстати, LOCALE_SYSTEM_DEFAULT не равно нулю. Нулю равно LOCALE_NEUTRAL. Учитывая выделенное, тем, кто пишет подбное, надо отрывать руки, голову и все остальные выступающие органы туловища . Все равно лишнее
DR>Выделенное означает: "тот программист, который эту фичу реализовывал, думал, что оно работает именно так..."
Я попробовал — 0 тоже возвращает аналогичные настройки, что и user и system локали.. так что, дело все же не в этом, просто, видимо (судя по цитате), они сами запутались в том, что сделали.
Здравствуйте, DimRus, Вы писали:
DR>Вообще-то Excel и прочие настройку разделителя дробной части любят брать из системной локали. Не многие юзеры догадаются там ее поменять.
Щас, ради импорта таблицы полезем локаль поменяем... шрифты системные подкрутим... что ещё порекомендуете сделать юзеру ради единственной программы.
Правильное решение (для Office 2003) — поменять настройки в самом экселе.
Причём можно настроить, импортировать таблицу, затем обратно вернуть.
Здравствуйте, Andrew S, Вы писали:
AS>...Решил посмотреть, что там с Invoke. Все потоки выполняются с 419-й локалью, а в Invoke попадает 409-я (English). Там разделитель всегда точка. AS>Скорее всего, ворд тупо устанавливает текущую локаль на то, что передается в Invoke. Но откуда она вызывается — ведь никаких методов не надо, просто из скрипта пишем CreateObject("Word.Application") и уже прилетает птица обломинго... В общем, я не понимаю, что откуда
А, так то процессор скриптов в Invoke запихует всяку гадость... Насколько я помню, в VB нужно вызвать его функцию setLocale(lcid)
AS>>...Решил посмотреть, что там с Invoke. Все потоки выполняются с 419-й локалью, а в Invoke попадает 409-я (English). Там разделитель всегда точка. AS>>Скорее всего, ворд тупо устанавливает текущую локаль на то, что передается в Invoke. Но откуда она вызывается — ведь никаких методов не надо, просто из скрипта пишем CreateObject("Word.Application") и уже прилетает птица обломинго... В общем, я не понимаю, что откуда
DR>А, так то процессор скриптов в Invoke запихует всяку гадость... Насколько я помню, в VB нужно вызвать его функцию setLocale(lcid)
Да, это так. Но что запихивает, например, интернет эксплорер, я не знаю (и запихивает ли что то вообще, как я уже говорил, фишка в том, что ошибка выползает _сразу_ после CreateObject("Word.Application"), т.е., фактически, после запуска ком сервера. Ни о каких invoke еще речи и не идет...
setLocale(1049)
Set w = CreateObject("Word.Application")
Та же самая ошибка, в не зависимости от задаваемой локали...
Да и вообще — проверил, в Invoke всегда передается 409-я, вне зависимости от setLocale. Вот такие дела. Если неправильно ставим локаль — то бейсик ругается "объект не поддерживает выбранные национальные настройки", т.е. сам setLocale хоть как то, но работает. Что то тут завязано на создание объекта, однозначно.. но как — это надо спецов по Com дергать...
Здравствуйте, Andrew S, Вы писали:
К>>Причём можно настроить, импортировать таблицу, затем обратно вернуть.
AS>А с вордом шо делать? Задолбал ужо этот гад
А ворд работает с буквами, а не числами. Сделать замену точки на запятую в выделенном блоке — какие проблемы.
Больше того, ворд знает о многоязыкости и выполняет автоформат в зависимости от текущей клавиатуры. Например,
ввожу: h e l l o (пробел) " w o r l d (переключился в русский язык) "
вижу: h
He - коррекция первой буквы
Hello “ - открывающая кавычка в английском стиле (верхняя открывающая лапка)
Hello “world
Hello “world» - закрывающая кавычка в русском стиле (ёлочка)