|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Самое простое, построить COM-сервер как .exe-файл со встроенным config.fpw со строкой CODEPAGE=866. Тогда никакой настройки вызывающего потока Windows не требуется. Но создание множества потоков с экземплярами такого сервера потребует слишком много оперативной памяти. А COM-сервер как .DLL-файл использует CODEPAGE от вызывающего потока Windows, в котором CODEPAGE=1251 по умолчанию. Какими средствами можно изменить это умолчание в среде .NET (или Win32 API) ??? Опасаюсь, что такой вопрос на форуме .NET вызовет недоумение по поводу фоксовской CPCURRENT(). А нужен такой COM-сервер, чтобы в досовских таблицах использовать индексы по полям с двоичным текстом (с кодами символов от 0 до 255). При CPCURRENT()==1251 не работают SEEK и SET RELATION. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 14:11 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Если не ошибаюсь, кодовую страницу по умолчанию можно задать только в config.fpw Попробуй включить config.fpw в проект и собрать вместе с ним. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 14:38 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Dima T, спасибо. но это не про мой вопрос. Неловко быть невежливым, но повторю выборочно строки моего вопроса Rostislav D. KudryashovСамое простое, построить COM-сервер как .exe-файл со встроенным config.fpw со строкой CODEPAGE=866. Тогда никакой настройки вызывающего потока Windows не требуется. ... А COM-сервер как .DLL-файл использует CODEPAGE от вызывающего потока Windows, в котором CODEPAGE=1251 по умолчанию.Как видишь, я начал именно с того, что ты советуешь попробовать. Но .exe-файл не годится (причина в 1-м сообщении), а .dll-файл не реагирует на config.fpw. И разумеется, настройка потока Windows никак не исполнима средствами Фокса. Только через Win32 API или в среде .NET. Но пока не могу найти. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 15:18 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
А что мешает включить config.fpw в DLL-проект ? Вкладка Other - подраздел Other files - кнопка Add ... поставить маску All files и выбрать config.fpw По-большому счету ты не то лечишь. У тебя кривые DBF-ки. Подозреваю что от какой-то старинной досовской проги (FoxPro 2.x например), в те времена проги не писали кодовую страницу в заголовок DBF (29-й байт), там стоит 0, что для фокса означает использовать кодовую страницу по умолчанию. Ты это победил установив 866 в config.fpw Но по-хорошему надо установить правильную кодовую страницу в заголовке, тогда фокс это учтет и будет корректно работать при CPCURRENT()==1251 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 15:52 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Dima T, ты это серьёзно? Dima TА что мешает включить config.fpw в DLL-проект ? Что тебе дважды помешало принять к сведению RostislavСамое простое, построить COM-сервер как .exe-файл со встроенным config.fpw со строкой CODEPAGE=866 ... А COM-сервер как .DLL-файл использует CODEPAGE от вызывающего потока Windows, в котором CODEPAGE=1251 по умолчанию. Rostislav.dll-файл не реагирует на config.fpw. Похоже, ты решил забить мой вопрос обструкцией. Но, поскольку умнее тебя здесь никого нет, придётся мне на мой вопрос махнуть рукой. Вот напал на http://msdn.microsoft.com/en-us/library/aa272906(v=vs.60).aspx setlocale( LC_ALL, ".OCP" ); Explicitly sets the locale to the current OEM code page obtained from the operating system. Но экземпляр сервера, создаваемый после этого из .dll-файла, всё равно сообщает, что у него CPCURRENT()==1251. Не помогает также и дот-нетовское Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("ru-RU.866"); Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("ru-RU.866"); ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 16:24 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Rostislav D. KudryashovRostislav.dll-файл не реагирует на config.fpw. Извиняюсь, н езаметил эту фразу. Твоя DLL с COM-сервером на чем написана? На фоксе или .NET? PS Про 29-й байт я писал. Его менять на правильный пробовал? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 16:32 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Dima T, COM-сервер конечно на Фоксе Код: plaintext 1. 2. 3. 4.
Оформление этого сервера как .exe-файла со встроенным config.fpw с CODEPAGE=866 всегда сообщает о CPCURRENT()==866, а из .dll-файла всегда получаю 1251. Создаю экземпляр класса хоть в Фоксе (с CODEPAGE=1251), хоть в программе на C# (как мне реально и надо будет) - без разницы. Dll строю Multi-threaded, Single не годится, т.к. при использовании генерирует буферный файл SERVERNAMEr.dll (с буковкой r) - совсем не нужный. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 16:49 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Эта CPCURRENT()==1251 для фоксовского сервера в виде .DLL-файла забита наверно где-то в исполняющей системе Фокса. Т.к. 1251 остаётся и при построении самого сервера и последующем запуске его из фоксовой среды, запущенной с config.fpw со строкой CODEPAGE=866. Не помогает даже тотальное задание CodePage=866 на вкладке Files в диалоге "Project Information", вызываемом из контекстного меню проекта сервера. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 17:40 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Знатоков COM/DCOM ты врядли найдешь на этом форуме. Мало кому это вообще надо, т.к. есть более эффективные решения. Лично я делал COM-сервер на фоксе всего один раз, и то не по собственному желанию: надо было вызывать из 1С, а 1С других вариантов не дает. Согласно хэлпуBUILD MTDLL ...Many user input commands and functions are not supported. Возможно эта настройка попала в этот самый неподдерживаемый набор. Но других способов нет задать кодовую страницу по умолчанию. Только config.fpw Что насчет 29-го байта? Лечить надо источник проблемы, а не бороться с последствиями. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 18:12 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Rostislav D. KudryashovDll строю Multi-threaded могу ошибаться, теорию DCOM`а давно изучал, но как помнится in-process COM-сервер, т.е. dll, возможен только при использовании локально, т.е. COM, в случае удаленного использования (DCOM) создается отдельный процесс на сервере и есть большое подозрение что твое желание создавать потоки в одном процессе реально происходит как создание кучи процессов на сервере. Проверь: создай несколько объектов на клиенте и посмотри планировщиком что реально на сервере происходит. Один процесс создается или несколько. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 18:29 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Dima T, насчёт потоков нет проблем. Их предполагается создавать на серверном ПК на C#. Клиенты подключаются к серверному ПК по TCP/IP. Каждому клиенту своё соединение. Была идея запускать в каждом потоке свой экземпляр фоксовского сервера - желательно in-process из DLL-файла. Но получается, что из-за индексов по полям с двоичным текстом в досовских таблицах придётся оформлять фоксовский сервер out-process в exe-файле. Не смертельно. Несколько десятков клиентов серверный ПК потянет, надо будет больше - поставят рядом столько ПК, сколько нужно. А больше сотни клиентов не будет никогда. Кстати, про удалённый запуск DCOM-ских DLL-серверов, например, VFPOLEDB. У Микрософта на этот случай была изобретена RDS-технология, но они грозятся, что в Win8 исключат её. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 19:23 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Я же писал уже что тормоза не в потоках/процессах, а в их создании. Если у тебя будет создано 100 процессов (по одному для каждого клиента), то сервер это не перегрузит. Главное чтобы не приходилось постоянно создавать и завершать процесс. Т.е. Если твой клиент при старте создаст объект на сервере и будет им пользоваться до своего завершения, то тормозов быть не должно. PS Насчет многопоточного использования фокса есть большие сомнения в надежности. Фокс однопоточен в обычном режиме, поэтому нет гарантий что в многопоточном режиме не вылезет какой-нибудь баг невыявленный разработчиками. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2014, 19:46 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
А если вынести непосредственно весь код работы с таблицами в prg процедурный файл который откомпилировать COMPILE AS 866, подключать его при создании ком-объекта через SET PROCEDURE TO ADDITIVE, а в интерфейсах сервера оставить только вызовы скриптов из этого процедурного файла? ЗЫ ну и CPCONVERT никто не отменял ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2014, 09:39 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
NSFuimus1, если я обратился на форум за советом, значит ли это, что я обязан просвещать и указывать на нелепые ошибки всем моим советчикам? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2014, 09:50 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
во-первых могли бы просто сказать "не прокатит ... без комментариев" :) во-вторых ну, да, - мне интересно услышать развернутое мнение ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2014, 10:01 |
|
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
|
|||
---|---|---|---|
#18+
Не смог найти исходников, немного напрягся вспоминая суть ... но работать подобным образом (из среды 1251 (ms c++)) с таблицами FoxPro Dos приходилось именно через ком-сервер dll ... вызов интерфейса ком-сервера->вызов процедурного файла (1251)->при необходимости вызвать метод из процедурного файла из состава App FoxPro Dos приходилось делать динамический COMPILE AS 866 для него (с предварительным копированием - менялись часто и при прямом обращении по-моему возникали конфликты доступа - что-то такое ... не помню точно)->при необходимости в процфайле (1251) дополнительно работать (поиск в 866 таблицах) со значениями возвращаемыми из процфайла (866) приходилось делать CPCONVERT ... как-то так ... ну и исходя из написанного это наверно не ваш случай ... забейте ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2014, 10:55 |
|
|
start [/forum/topic.php?fid=41&msg=38772009&tid=1582519]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 151ms |
0 / 0 |