Форум » [x]Harbour » Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка" » Ответить

Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка"

Sergy: Добрый день, уважаемые коллеги. Большое спасибо за море справочной информации по переходу, но нужно ещё пнуть меня в нужном направлении. Итак, установил Harbour 3.0 + BCC 5.5.1 ==>> 3.2.0 +minGW скомпилировал и запустил традиционный "Hello, world!" Дело перешло к проекту, из-за которого собственно и речь. Компилируется что через hbmk2, что самим харбором - без ошибок, всего с парой предупреждений, что меня немало удивило. Возникли ошибки на этапе линковки: [more]Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: Unresolved external '_HB_FUN_ENVPARAM' referenced from D:\HB\TRADE100.OBJ Error: Unresolved external '_HB_FUN_INKEYTRAP' referenced from D:\HB\TRADE226.OBJ Error: Unresolved external '_HB_FUN_DISKFREE' referenced from D:\HB\TRADE222.OBJ Error: Unresolved external '_HB_FUN_DISKTOTAL' referenced from D:\HB\TRADE222.OBJ Error: Unresolved external '_HB_FUN_BIOSDATE' referenced from D:\HB\TRADE.OBJ Error: Unresolved external '_HB_FUN_FT_ONTICK' referenced from D:\HB\TRADE.OBJ Error: Unresolved external '_HB_FUN_FT_ONIDLE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_FT_IAMIDLE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_TRAPANYKEY' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_KEYSEND' referenced from D:\HB\TRADE200.OBJ 1) Так понимаю, это ошибки из-за того, что не находятся некоторые функции из активно используемых CT3/Nanforum Toolkit ? Что делать с ними ? Отказываться ? Или есть заменители ? Error: Unresolved external '_HB_FUN_STACKFREE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCUSE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCAVL' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCTOT' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCUSE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCAVL' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCTOT' referenced from D:\HB\TRADE200.OBJ 2) Это - ошибки из-за вызовов встроенных в Blinker функций, без них легко обойтись в принципе... Error: Unresolved external '_HB_FUN_STRNUM2ARRAY' referenced from D:\HB\TRADE208.OBJ Error: Unresolved external '_HB_FUN_CMJS_EXTRACTPARAMS' referenced from D:\HB\TRADE206.OBJ Error: Unresolved external '_HB_FUN_SELECTSTOCKS' referenced from D:\HB\TRADE220.OBJ Error: Unresolved external '_HB_FUN_APPLYSERTCHAGES' referenced from D:\HB\TRADE221.OBJ Error: Unresolved external '_HB_FUN_APPLYCARGOCHAGES' referenced from D:\HB\TRADE221.OBJ Error: Unresolved external '_HB_FUN_APPLYPRICECHAGES' referenced from D:\HB\TRADE221.OBJ 3) А вот это - самое странное - это мои функции, причем некоторые из них вызываются многократно из других модулей. Например ApplyCargoChanges является STATIC в самом модуле TRADE221 - почему линковщик ее не видит, наряду с парой Apply... других ? SelectStocks активно используется в других модулях - но там линкер почему-то ошибок не видит... [/more] Help, please - что делать и куды бечь ?

Ответов - 285, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Vlad04: От DBFNTX отказался, сразу переделывал под cdx

Dima: Sergy я что то пропустил а антивирус стоит ? в исключениях числятся у него папки с базами и прогой ?

Sergy: Нашел в коде еще несколько прямых вызовов DBUSEAREA() и DBSETNDEX() - заменил их на свои NetUse() и NetSetIndex(). Пока конечно рано говорить, но ситуация по ходу стабилизировалась - нет непонятных сообщений о неоткрытых областях, отсутствии индексации и тп... Одна машина пока прислала несколько отчетов о том, что с первого раза не удалось открыть таблицу.


Sergy: Dima пишет: я что то пропустил а антивирус стоит ? в исключениях числятся у него папки с базами и прогой ? Стоит официальный лицензионный NOD32 - на сервере серверная версия, у клиентов - клиентские. Разумеется на сервере *.dbf и *.ntx стоят в исключениях. Программу в исключения не ставил никогда - проблем особых не было. Ну проверит один раз при запуске - делов-то... Все-таки EXE - он может быть заражен при определенном стечении обстоятельств... На рабочих машинах - 100% гарантии нет, но админ сети вроде в курсе. Кстати будет повод проверить...

SergKis: Sergy пишет:res:=DBSETINDEX(cName) IF res; EXIT; ENDIF Clipper ng говорит dbSetIndex() return NIL, в hb dbSetIndex() это вызов hb_func( ORDLISTADD ) и там возвраты разные и написано: /* Clipper clears NETERR flag when index is open */ hb_rddSetNetErr( HB_FALSE ); может лучше из SET INDEX ... функции в команде использовать, ? OrdCount() даст кол-во подключенных index\tag

Pasha: Sergy пишет: Получил одно вот такое сообщение: 27.08.2013 09:45:46 NetUse(caroute) tried to open 1 times and OK Это говорит о том, что менее чем на секунду файл все-таки был открыт каким-то процессом. А вот каким - в этом мы вряд ли поможем. Возможные предположения уже высказаны. Хорошо бы еще в лог писать режим открытия - lShared и несколько вот таких: Ошибка DBFNTX/1201 Файл не индексирован В NetSetIndex() поставил проверку успешности открытия индекса ( res:=DBSETINDEX() ), но почему-то она не сработала ? Если dbSetIndex вернул .t. - значит, индекс был открыт успешно, и никак не иначе. А причина ошибки 1201 может быть другой: индекс был закрыт, был вызов set order to 0, или set order на несуществующий индекс, или где-то ошибка в имени индекса, в результате чего текущий индекс оказался не установлен. Сергей, только не говорите, что такого не может быть, иначе мы ничем не сможем помочь. Пересмотрите еще раз свой код, вставьте дополнительные логи в конце концов.

Pasha: SergKis пишет: Clipper ng говорит dbSetIndex() return NIL, в hb dbSetIndex() это вызов hb_func( ORDLISTADD ) и там возвраты разные и написано: /* Clipper clears NETERR flag when index is open */ hb_rddSetNetErr( HB_FALSE ); может лучше из SET INDEX ... функции в команде использовать, ? OrdCount() даст кол-во подключенных index\tag Да, правильно, успешность открытия индекса лучше проверять чем нибудь вроде: IndexOrd() # 0 ! Empty(IndexKey()) ! Empty(ordName())

Dima: Sergy Где то есть аналогичная тема от AndreyZh тоже переходил человек с Clipper и тоже были не увязки и споры. Сегодня у него кажется все нормально так что даже редко тут появляется ;) PS А лагов в сети нет ?

Sergy: Pasha пишет: Сергей, только не говорите, что такого не может быть Хорошо, не буду. Dima пишет: А лагов в сети нет ? Что имеется в виду и как это выяснить ?

Dima: Sergy На "проблемных" станциях как вариант дай команду ping ipсервера -n 100 -l 1400 и посмотри результат

PSP: Сеть лучше утилитой iperf проверить в режиме трансляции udp-пакетов.

Sergy: SergKis пишет: Clipper ng говорит dbSetIndex() return NIL, в hb dbSetIndex() это вызов hb_func( ORDLISTADD ) и там возвраты разные и написано: /* Clipper clears NETERR flag when index is open */ hb_rddSetNetErr( HB_FALSE ); может лучше из SET INDEX ... функции в команде использовать, ? OrdCount() даст кол-во подключенных index\tag Почитал Changelog.txt: * changed ordListAdd()/dbSetIndex() - now they return logical value with information about success Пока остановился на этом варианте. Несколько предыдущих ошибок "Файл не индексирован" выскочили из-за того, что в паре-тройке мест остались прямые вызовы DBUSEAREA/DBSETINDEX вместо замененных мною USE ... INDEX ... upd: Поймал наконец-то и такие ошибки: 27.08.2013 14:37:33 NetSetIndex(system) tried to open 1 times and OK 27.08.2013 14:47:22 NetSetIndex(F:\WORK\DATA\carjob2.ntx) tried to open 1 times and OK Что самое странное - программа запускается на сервере и управляется через RDP - т.е. диск с базой у нее вообще локальный, а не по сети. И проверил, что Харборовский DBSETINDEX() возвращает корректный результат для обработки в NetSetIndex() ... продолжаю наблюдения. Спасибо коллективному разуму.

SergKis: Sergy пишет:Почитал Changelog.txt первоисточник SRC hb 3.2 [pre2] HB_FUNC( ORDLISTADD ) { ... if( ! HB_ISNIL( 1 ) ) hb_errRT_DBCMD( EG_ARG, EDBCMD_ORDLSTADD_BADPARAMETER, NULL, HB_ERR_FUNCNAME ); return; !!!!!!!!!! } ... if( ! pOrderInfo.itmResult || HB_IS_NIL( pOrderInfo.itmResult ) ) hb_retl( errCode == HB_SUCCESS ); !!!! ... FUNCTION dbSetIndex( cIndexName ) RETURN ordListAdd( cIndexName ) [/pre2] Sergy пишет:Что самое странное - программа запускается на сервере и управляется через RDP - т.е. диск с базой у нее вообще локальный, а не по сети SergKis пишет: использования clipper, hb показала, даже на локальной базе ... причем полгода может работать, а потом кердык - начнет елозить. Разбор полетов покажет как правило анти\вирус обновили, заменили ...

Sergy: Мужчины, огромная вам всем благодарность за помощь и поддержку! Третий день программа работает практически как часы на ежедневной нагрузке. И как работает - летает, как ласточка, все юзеры довольны. Ничего того, что-бы меня удивило в ее поведении - нет. А ведь неделей раньше рвал волосы во всех местах и уже подумывал - бросить все нак*й и вернуться на Clipper. Кое-где выплывают косяки моего программирования, которых не замечал наш старый добрый 5.2e. Потихоньку накапливаются сообщения о том, что таблица/индекс не открылись с первого раза. Пытаюсь понять логику - информации мало, но похоже, что они возникают на "сверхбыстрых" машинах на локальных ресурсах. Например, "разгруженном" от юзеров терминальном сервере (рано утром или поздно вечером). Благодаря Вашим наработкам в этой ветке, научил программу "пипикать" wave-файлами из ресурсов, блокировать крестик, менять заголовок Windows-окошка. Так классно! Спасибо еще раз! На этом не прощаюсь - искренне надеюсь, еще будут интересные вопросы и обсуждения.

Pasha: Запускаю свою харбор-программу, которая открывает файлы через dbfcdx - shared. Запускаю dosbox, а в нем - программу, которая открывает dbf-файл монопольно (свой старый dbview под ms dos). Файл не должен открываться, но он открывается. Если попытаться открыть этот файл монопольно win32-программой, то попытка будет неуспешной, как и должно быть. Выходит, что открытие файлов под ntvdm/dosbox происходит не по правилам. Вот поэтому старая клиппер-программа и всегда открывала файлы, которые не должна была открывать, в отличие от харбор-программы, которая ведет себя, как ей и положено.

Dima: Pasha пишет: Запускаю свою харбор-программу, которая открывает файлы через dbfcdx - shared. Запускаю dosbox, а в нем - программу, которая открывает dbf-файл монопольно (свой старый dbview под ms dos). Файл не должен открываться, но он открывается. Попробовал повторить (без DOSBOX разумеется). Файл не открылся. Первой запустил Harbour прогу [pre2] proc main use test shared new browse() return [/pre2] Вторая на Clipper [pre2] use test exclusive new browse() // бровса я не увидел и прога сразу завершила свою работу [/pre2] ЗЫ неисповедимы пути господни NTVDM

Sergy: Возникло подозрение, что сохранение длинной CHAR переменной в поле таблицы "портит" символы "нижней" части ASCII с кодом, меньшим CHR(32). Чтобы проверить это, хочу попробовать USE (cTable) CODEPAGE (...) Подскажите плиз, какую страницу нужно указать, чтобы полностью отказаться от перекодировки ? Нужен какой-нить "NULL" или "WESTERN EUROPE". Какие они вообще бывают, кроме "RU866" и "RU1251" - попробую методом перебора...

nick_mi: HB_FUNC_EXTERN( HB_CODEPAGE_BG866 ); HB_FUNC_EXTERN( HB_CODEPAGE_BGISO ); HB_FUNC_EXTERN( HB_CODEPAGE_BGMIK ); HB_FUNC_EXTERN( HB_CODEPAGE_BGWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_CS852 ); HB_FUNC_EXTERN( HB_CODEPAGE_CS852C ); HB_FUNC_EXTERN( HB_CODEPAGE_CSISO ); HB_FUNC_EXTERN( HB_CODEPAGE_CSKAMC ); HB_FUNC_EXTERN( HB_CODEPAGE_CSWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_DE850 ); HB_FUNC_EXTERN( HB_CODEPAGE_DE850M ); HB_FUNC_EXTERN( HB_CODEPAGE_DEISO ); HB_FUNC_EXTERN( HB_CODEPAGE_DEWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_DK865 ); HB_FUNC_EXTERN( HB_CODEPAGE_EL437 ); HB_FUNC_EXTERN( HB_CODEPAGE_EL737 ); HB_FUNC_EXTERN( HB_CODEPAGE_ELISO ); HB_FUNC_EXTERN( HB_CODEPAGE_ELWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_EN ); HB_FUNC_EXTERN( HB_CODEPAGE_ES850 ); HB_FUNC_EXTERN( HB_CODEPAGE_ES850C ); HB_FUNC_EXTERN( HB_CODEPAGE_ES850M ); HB_FUNC_EXTERN( HB_CODEPAGE_ESISO ); HB_FUNC_EXTERN( HB_CODEPAGE_ESMWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_ESWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_FI850 ); HB_FUNC_EXTERN( HB_CODEPAGE_FR850 ); HB_FUNC_EXTERN( HB_CODEPAGE_FR850M ); HB_FUNC_EXTERN( HB_CODEPAGE_FRISO ); HB_FUNC_EXTERN( HB_CODEPAGE_FRWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_HR646 ); HB_FUNC_EXTERN( HB_CODEPAGE_HR852 ); HB_FUNC_EXTERN( HB_CODEPAGE_HRISO ); HB_FUNC_EXTERN( HB_CODEPAGE_HRWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_HU852 ); HB_FUNC_EXTERN( HB_CODEPAGE_HU852C ); HB_FUNC_EXTERN( HB_CODEPAGE_HUISO ); HB_FUNC_EXTERN( HB_CODEPAGE_HUWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_IS850 ); HB_FUNC_EXTERN( HB_CODEPAGE_IS861 ); HB_FUNC_EXTERN( HB_CODEPAGE_IT437 ); HB_FUNC_EXTERN( HB_CODEPAGE_IT850 ); HB_FUNC_EXTERN( HB_CODEPAGE_IT850M ); HB_FUNC_EXTERN( HB_CODEPAGE_ITISB ); HB_FUNC_EXTERN( HB_CODEPAGE_ITISO ); HB_FUNC_EXTERN( HB_CODEPAGE_ITWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_LT775 ); HB_FUNC_EXTERN( HB_CODEPAGE_LTWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_NL850 ); HB_FUNC_EXTERN( HB_CODEPAGE_NL850M ); HB_FUNC_EXTERN( HB_CODEPAGE_NO865 ); HB_FUNC_EXTERN( HB_CODEPAGE_PL852 ); HB_FUNC_EXTERN( HB_CODEPAGE_PLISO ); HB_FUNC_EXTERN( HB_CODEPAGE_PLMAZ ); HB_FUNC_EXTERN( HB_CODEPAGE_PLWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_PT850 ); HB_FUNC_EXTERN( HB_CODEPAGE_PT860 ); HB_FUNC_EXTERN( HB_CODEPAGE_PTISO ); HB_FUNC_EXTERN( HB_CODEPAGE_RO852 ); HB_FUNC_EXTERN( HB_CODEPAGE_ROISO ); HB_FUNC_EXTERN( HB_CODEPAGE_ROWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_RU1251 ); HB_FUNC_EXTERN( HB_CODEPAGE_RU866 ); HB_FUNC_EXTERN( HB_CODEPAGE_RUISO ); HB_FUNC_EXTERN( HB_CODEPAGE_RUKOI8 ); HB_FUNC_EXTERN( HB_CODEPAGE_SK852 ); HB_FUNC_EXTERN( HB_CODEPAGE_SK852C ); HB_FUNC_EXTERN( HB_CODEPAGE_SKISO ); HB_FUNC_EXTERN( HB_CODEPAGE_SKKAMC ); HB_FUNC_EXTERN( HB_CODEPAGE_SKWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_SL646 ); HB_FUNC_EXTERN( HB_CODEPAGE_SL852 ); HB_FUNC_EXTERN( HB_CODEPAGE_SLISO ); HB_FUNC_EXTERN( HB_CODEPAGE_SLWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_SR646 ); HB_FUNC_EXTERN( HB_CODEPAGE_SR646C ); HB_FUNC_EXTERN( HB_CODEPAGE_SRWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_SV437C ); HB_FUNC_EXTERN( HB_CODEPAGE_SV850 ); HB_FUNC_EXTERN( HB_CODEPAGE_SV850M ); HB_FUNC_EXTERN( HB_CODEPAGE_SVISO ); HB_FUNC_EXTERN( HB_CODEPAGE_SVWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_TR857 ); HB_FUNC_EXTERN( HB_CODEPAGE_TRISO ); HB_FUNC_EXTERN( HB_CODEPAGE_TRWIN ); HB_FUNC_EXTERN( HB_CODEPAGE_UA1125 ); HB_FUNC_EXTERN( HB_CODEPAGE_UA1251 ); HB_FUNC_EXTERN( HB_CODEPAGE_UA866 ); HB_FUNC_EXTERN( HB_CODEPAGE_UAKOI8 );

Pasha: Sergy пишет: Подскажите плиз, какую страницу нужно указать, чтобы полностью отказаться от перекодировки ? Перекодировка не выполняется, если кодовая страница программы совпадает с кодовой страницей, указанной в команде use. Если в use не указана codepage, то она будет такой же, что в hb_cdpSelect, и перекодировки также не будет.

Sergy: Pasha пишет: Перекодировка не выполняется, если кодовая страница программы совпадает с кодовой страницей, указанной в команде use. Если в use не указана codepage, то она будет такой же, что в hb_cdpSelect, и перекодировки также не будет. А может быть какая-нибудь петрушка с SAVESCREEN / RESTSCREEN ? В одном месте программы, среди кучи однотипных вызовов: сохранение экрана - диалог - восстановление наблюдаю такой глюк: символы CHR(16) заменяются на "?" и соотв. выводятся назад уже не в виде треугольников, а в виде знаков вопроса. Сначала думал на запись в файл (экраны складываются локально, чтобы не тратить память Clipper). Поигрался с CODEPAGE, потом переделал на сохранение в memvar-переменных - тоже самое. Косяк совершенно незначительный, но бесит... Не люблю я эту неопределенность...



полная версия страницы