Страница 1 из 2

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 14:13
Губин Игорь
В процессе эксплуатации вылезла очередная фича
В приложении, под windows 7/8, до запуска фрейма и всего подобного, вызывается некая процедура, в которой есть переменная

WorkString SystemStringClass

В принципе, как видно, ничего криминального, но вызов процедуры приводит к ошибке приложения, но не фатальной, с кнопкой Continue

Видимо, это ошибка компилятора, т.к. переход к

WorkString &SystemStringClass

со всеми вытекающими, проблему решает

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 16:31
Игорь Столяров
В Libsrc переменные для этого класса везде определяются через указатель ...

Код: Выделить всё

SystemStringQueue   QUEUE
Str                     &SystemStringClass
                               END

SMSMailClient     CLASS,TYPE,MODULE('ClaMail.clw'),LINK('ClaMail.clw',_ABCLinkMode_),DLL(_ABCDllMode_)
!region Protected
claTalk               &ClaRunExtClass,PROTECTED
errorReporting        BOOL,PROTECTED
host                  &SystemStringClass,PROTECTED
user                  &SystemStringClass,PROTECTED
pwd                   &SystemStringClass,PROTECTED
from                  &SystemStringClass,PROTECTED
ssl                   BOOL,PROTECTED
port                  LONG,PROTECTED
...

wantAReceivedNotice   BOOL,PRIVATE
encoding              &SystemStringClass,PRIVATE
replyTo               &SystemStringClass,PRIVATE

Construct             PROCEDURE(),PROTECTED
Destruct              PROCEDURE(),VIRTUAL

и т.д.
Наверно все-таки просто начальное объявление было неправильным, а не глюк ...

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 16:38
Губин Игорь
Игорь Столяров писал(а): Наверно все-таки просто начальное объявление было неправильным, а не глюк ...
А в чём именно некорректность? :idied:

Код: Выделить всё

MyClass  CLASS,TYPE

MyField   LONG

MyProc    PROCEDURE

        END

OneClass MyClass           !Declared object instance, smaller and quicker

TwoClass &MyClass          !Object reference, must use New and DISPOSE

Дело в том, что это не первый глюк с SystemStringClass связанный с объявлением в такой форме.
Остальные классы почему-то так себя не ведут.

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 16:43
Игорь Столяров
Губин Игорь писал(а): А в чём именно некорректность?
Кто же знает ... Ошибку выдает ведь не объявление класса, а какой-то метод в процессе выполнения ?
Если есть желание разобраться - там и надо смотреть. Или объявлять тип данных, так как сделано в примерах.

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 16:43
Дед Пахом
Может это какой-нибудь ASSERT срабатывает? Нет ли номера строки в сообщении об ошибке?

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 17:10
Губин Игорь
Дед Пахом писал(а): Нет ли номера строки в сообщении об ошибке?
Изображение

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 17:13
Дед Пахом
Губин Игорь писал(а): Accept тут не при чём
Конечно ни при чём, я писал "ASSERT". Судя по номеру строки, что-то не так проинициализировано для Base64.

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 17:34
Губин Игорь
Дед Пахом писал(а):
Судя по номеру строки, что-то не так проинициализировано для Base64
Это-то конечно, только вот вопрос в том, ПОЧЕМУ не так проинициализировано?! :idied:
Ведь, сугубо формально, замена на & и последующее NEW должно быть абсолютно аналогично!
Дед Пахом писал(а):
Конечно ни при чём, я писал "ASSERT".
Переклинило... :oops:

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 17:34
Дед Пахом
Потрать 5 минут с отладчиком, делов-то.

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 17:38
Губин Игорь
Дед Пахом писал(а): Потрать 5 минут с отладчиком, делов-то.

Оно мне надо? Чтобы потом, после очередного патча, наткнуться на новое... :idied:
Да и фокус в том, что под 10 отрабатывает на ура, под XP тоже, а проявляется только под 7/8

Глюк локализован, дальше буду писать только &

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 17:48
RaFaeL
Губин Игорь писал(а): Да и фокус в том, что под 10 отрабатывает на ура, под XP тоже, а проявляется только под 7/8
А точно не от разрядности системы зависит? А то видел тут фокуc, на x32 работает на x64 глюки и вылеты

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 17:54
Губин Игорь
RaFaeL писал(а): А точно не от разрядности системы зависит? А то видел тут фокуc, на x32 работает на x64 глюки и вылеты
Увы, нет. Как мне сказали те, кто отлавливал, тестировали и на 32 и на 64. У меня тестировалось на 10/64, XP/32 и под 10/64 с запуском в режиме совместимости. В режиме совместимости программа запускалась нормально, работала корректно, но вылетала при закрытии.

Проблемный кусок выполнялся при запуске программы

Продолжаем копить глюки SyStemStrngClass

Добавлено: 06 Март 2017, 22:02
Игорь Столяров
Губин Игорь писал(а):Проблемный кусок выполнялся при запуске программы
Вот это, к сожалению, ни о чем не говорит ... Похоже на проблемы с освобождением памяти.
В каком релизе C63 был глюк: при запуске отрывалось окно регистрации юзера (NоMDI есстесно), а потом AppFrame программы.
Так вот если в окне регистрации вызывать справку (CHM) - то все работало прекрасно, но закрытие AppFrame (и всего приложения)
заканчивалось стабильно GPF ... причем именно на десктопных Windows, а на том же Windows 2003 никаких проблем не возникало.

Продолжаем копить глюки SyStemStrngClass

Добавлено: 07 Март 2017, 10:19
Губин Игорь
Игорь Столяров писал(а): Вот это, к сожалению, ни о чем не говорит ... Похоже на проблемы с освобождением памяти.
Больше на вылет за границы.Но фиг его знает, вашбродь! :idied:

Продолжаем копить глюки SyStemStrngClass

Добавлено: 07 Март 2017, 13:13
Дед Пахом
Разница во времени вызова конструктора Construct(), в первом случае он вызывается при объявлении переменной, во втором при вызове NEW. Например, такой случай:

Код: Выделить всё

MyStringClass CLASS(SystemStringClass), TYPE
Construct        PROCEDURE()  !-- overloaded
              END
  
myString       MyStringClass
v1             STRING(100)


MyStringClass.Construct PROCEDURE()
  CODE
  SELF.FromString(v1)
Тут конструктор вызывается перед объявлением v1, и результат непредсказуем. Если же объявить myString &MyStringClass, то NEW будет вызван после объявления v1, и всё ok.