powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
16 сообщений из 16, страница 1 из 1
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38771720
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое простое, построить 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.
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38771783
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не ошибаюсь, кодовую страницу по умолчанию можно задать только в config.fpw

Попробуй включить config.fpw в проект и собрать вместе с ним.
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38771856
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. Но пока не могу найти.
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38771945
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает включить config.fpw в DLL-проект ? Вкладка Other - подраздел Other files - кнопка Add ... поставить маску All files и выбрать config.fpw

По-большому счету ты не то лечишь. У тебя кривые DBF-ки. Подозреваю что от какой-то старинной досовской проги (FoxPro 2.x например), в те времена проги не писали кодовую страницу в заголовок DBF (29-й байт), там стоит 0, что для фокса означает использовать кодовую страницу по умолчанию. Ты это победил установив 866 в config.fpw
Но по-хорошему надо установить правильную кодовую страницу в заголовке, тогда фокс это учтет и будет корректно работать при CPCURRENT()==1251
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772009
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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");
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772027
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. KudryashovRostislav.dll-файл не реагирует на config.fpw.
Извиняюсь, н езаметил эту фразу.

Твоя DLL с COM-сервером на чем написана? На фоксе или .NET?

PS Про 29-й байт я писал. Его менять на правильный пробовал?
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772054
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, COM-сервер конечно на Фоксе
Код: plaintext
1.
2.
3.
4.
DEFINE CLASS VFPServer AS Custom OLEPUBLIC
FUNCTION GetCP AS Number
RETURN CPCURRENT()
ENDFUNC && VFPServer.GetCP
ENDDEFINE && VFPServer
именно ради того чтоб использовать без ограничений индексы по текстовым полям с "двоичным" текстом в досовских таблицах.
Оформление этого сервера как .exe-файла со встроенным config.fpw с CODEPAGE=866 всегда сообщает о CPCURRENT()==866, а из .dll-файла всегда получаю 1251. Создаю экземпляр класса хоть в Фоксе (с CODEPAGE=1251), хоть в программе на C# (как мне реально и надо будет) - без разницы.
Dll строю Multi-threaded, Single не годится, т.к. при использовании генерирует буферный файл SERVERNAMEr.dll (с буковкой r) - совсем не нужный.
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772158
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта CPCURRENT()==1251 для фоксовского сервера в виде .DLL-файла забита наверно где-то в исполняющей системе Фокса. Т.к. 1251 остаётся и при построении самого сервера и последующем запуске его из фоксовой среды, запущенной с config.fpw со строкой CODEPAGE=866.
Не помогает даже тотальное задание CodePage=866 на вкладке Files в диалоге "Project Information", вызываемом из контекстного меню проекта сервера.
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772228
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знатоков COM/DCOM ты врядли найдешь на этом форуме. Мало кому это вообще надо, т.к. есть более эффективные решения. Лично я делал COM-сервер на фоксе всего один раз, и то не по собственному желанию: надо было вызывать из 1С, а 1С других вариантов не дает.

Согласно хэлпуBUILD MTDLL
...Many user input commands and functions are not supported.
Возможно эта настройка попала в этот самый неподдерживаемый набор. Но других способов нет задать кодовую страницу по умолчанию. Только config.fpw

Что насчет 29-го байта? Лечить надо источник проблемы, а не бороться с последствиями.
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772250
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. KudryashovDll строю Multi-threaded
могу ошибаться, теорию DCOM`а давно изучал, но как помнится in-process COM-сервер, т.е. dll, возможен только при использовании локально, т.е. COM, в случае удаленного использования (DCOM) создается отдельный процесс на сервере и есть большое подозрение что твое желание создавать потоки в одном процессе реально происходит как создание кучи процессов на сервере. Проверь: создай несколько объектов на клиенте и посмотри планировщиком что реально на сервере происходит. Один процесс создается или несколько.
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772295
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, насчёт потоков нет проблем. Их предполагается создавать на серверном ПК на C#. Клиенты подключаются к серверному ПК по TCP/IP. Каждому клиенту своё соединение. Была идея запускать в каждом потоке свой экземпляр фоксовского сервера - желательно in-process из DLL-файла. Но получается, что из-за индексов по полям с двоичным текстом в досовских таблицах придётся оформлять фоксовский сервер out-process в exe-файле.
Не смертельно. Несколько десятков клиентов серверный ПК потянет, надо будет больше - поставят рядом столько ПК, сколько нужно. А больше сотни клиентов не будет никогда.
Кстати, про удалённый запуск DCOM-ских DLL-серверов, например, VFPOLEDB. У Микрософта на этот случай была изобретена RDS-технология, но они грозятся, что в Win8 исключат её.
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772314
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же писал уже что тормоза не в потоках/процессах, а в их создании. Если у тебя будет создано 100 процессов (по одному для каждого клиента), то сервер это не перегрузит. Главное чтобы не приходилось постоянно создавать и завершать процесс. Т.е. Если твой клиент при старте создаст объект на сервере и будет им пользоваться до своего завершения, то тормозов быть не должно.

PS Насчет многопоточного использования фокса есть большие сомнения в надежности. Фокс однопоточен в обычном режиме, поэтому нет гарантий что в многопоточном режиме не вылезет какой-нибудь баг невыявленный разработчиками.
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772654
NSFuimus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если вынести непосредственно весь код работы с таблицами в prg процедурный файл который откомпилировать COMPILE AS 866, подключать его при создании ком-объекта через SET PROCEDURE TO ADDITIVE, а в интерфейсах сервера оставить только вызовы скриптов из этого процедурного файла?

ЗЫ ну и CPCONVERT никто не отменял
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772670
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NSFuimus1, если я обратился на форум за советом, значит ли это, что я обязан просвещать и указывать на нелепые ошибки всем моим советчикам?
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772683
NSFuimus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
во-первых могли бы просто сказать "не прокатит ... без комментариев" :)
во-вторых ну, да, - мне интересно услышать развернутое мнение
...
Рейтинг: 0 / 0
Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
    #38772795
NSFuimus1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не смог найти исходников, немного напрягся вспоминая суть ... но работать подобным образом (из среды 1251 (ms c++)) с таблицами FoxPro Dos приходилось именно через ком-сервер dll ... вызов интерфейса ком-сервера->вызов процедурного файла (1251)->при необходимости вызвать метод из процедурного файла из состава App FoxPro Dos приходилось делать динамический COMPILE AS 866 для него (с предварительным копированием - менялись часто и при прямом обращении по-моему возникали конфликты доступа - что-то такое ... не помню точно)->при необходимости в процфайле (1251) дополнительно работать (поиск в 866 таблицах) со значениями возвращаемыми из процфайла (866) приходилось делать CPCONVERT ... как-то так ... ну и исходя из написанного это наверно не ваш случай ... забейте
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как настроить поток, чтоб фоксовский COM-сервер из этого потока использовал CODEPAGE=866 ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]