1.9.3 При вызове метода COM-объекта вместо Непоределено в приемник приходит число -2147352572 (E_ABORT)
Опишите ошибку При вызове метода COM-объекта вместо Непоределено в приемник приходит число -2147352572=0x80000004=E_ABORT
Воспроизведение ошибки
- В модуле приложения базы 1С объявить метод
Функция ОткрытьПоискВМодулях(Знач ЧтоИскать = Неопределено, Знач Автозапуск = Истина) Экспорт
ЗаписьЖурналаРегистрации("Вон", УровеньЖурналаРегистрации.Предупреждение,,, ЧтоИскать);
КонецФункции
- Через COm V83.Application подключиться к этой базе и вызвать
COM.ОткрытьПоискВМодулях(Неопределено, Ложь) - В журнале регистрации видно событие "Вон" с числом -2147352572
Ожидаемое поведение Приход в первом параметре значения Неопределено.
Окружение
- ОС: Windows 10
- Версия: 1.9.3
- Турбоконф 6.4.9
Ошибка является следствием правок в 1.9.2, т.к. в Турбоконфе с ОСкрипт 1.9.1 она не возникает.
5 часов вылавливал ошибки в работе своего скрипта для Турбоконфа, порожденные этой ошибкой. Это было трудно. Удалось в обоих местах решить возникшие ошибки правкой скрипта. И пока еще нет полной уверенности что все повреждения найдены, т.к. скрипт большой и имеет очень много точек входа.
Ошибка весьма трудоемкая в плане отлова всех ее проявлений. Поэтому считаю ошибку серьезной и требующей выпуска исправительной версии. Подозреваю, что и в версию 2.* ее тоже занесли.
Обошел эту ошибку в обнаруженных местах ее проявления в скрипте путем устранения передачи Неопределено и проверкой на число -2147352572 на принимающей вызов стороне.
Нашел еще одно место в своем скрипте, где передавалось Неопределено. Опять же искать пришлось сложно и долго. И похоже оно не последнее. Можно надеяться на скорое исправление или лучше откатываться на 1.9.1?
Нашел еще одно место в своем скрипте, где передавалось Неопределено. В этот раз правда быстро нашел причину. Но думаю что это - не последнее место.
^ не связано с обработкой параметров по умолчанию. это правки по nativeapi
@tormozit вот твой же комментарий
Тут что то про параметры по умолчанию
Сначала ContextValuesMarshaller.ConvertToClrObject() превращает Неопределено в Null
https://github.com/EvilBeaver/OneScript/blob/3845405819e3f6f5dacf6dad110c2bbf5d27ef1d/src/ScriptEngine/Machine/Contexts/ContextValuesMarshaller.cs#L371
А затем этот Null в COMWrapperContext.MarshalIValue() превращается в Missing.Value, т.е. <пропущенный параметр>
https://github.com/EvilBeaver/OneScript/blob/3845405819e3f6f5dacf6dad110c2bbf5d27ef1d/src/ScriptEngine/Machine/Contexts/COMWrapperContext.cs#L161C17-L161C94
retValue = ContextValuesMarshaller.ConvertToClrObject(val) ?? Missing.Value;;
Выяснилось новое обстоятельство. Работало корректно на версии 1.9.1, а не 1.9.2. Поэтому проблема есть следствие этой правки в 1.9.2 https://github.com/EvilBeaver/OneScript/issues/1405
- v2 и v1.9.2+ работают одинаково
- число
-2147352572==0x80020004не E_ABORT, а DISP_E_PARAMNOTFOUND, что логично - если функцию вызывать с параметром, не имеющим значения по умолчанию, не в виде литерала
Неопределено, а переменной со значениемНеопределено, то вызова не произойдет, а скрипт упадет с ошибкой Внешнее исключение (System.Runtime.InteropServices.COMException): Параметр является обязательным. (Исключение из HRESULT: 0x8002000F (DISP_E_PARAMNOTOPTIONAL)) - если
Неопределенопередавать в вызов V83.Application какnull- всё работает, 1С интерпретирует его именно какНеопределено - в свою очередь, переданное Missing.Value работает в 1С как пропущенный параметр
Резюмируя: пропущенный в скрипте параметр (DataType.NotAValidValue) надо пробрасывать до вызова функций COM-объекта. При этом не сломать вызовы других (каких?) динамических объектов.
если функцию вызывать с параметром не в виде литерала Неопределено, а переменной со значением Неопределено, то вызова не произойдет, а скрипт упадет с ошибкой
У меня в обоих случаях передается число -2147352572 и ошибки вызова не возникает. Решение я предложил тут https://github.com/EvilBeaver/OneScript/issues/1405
Решение из #1405 не сработает, преобразование DataType.NotAValidValue -> DataType.Undefined выполняется раньше
@Mr-Rm можешь указать о каком месте в коде речь? Я поискал по "DataType.NotAValidValue", но не смог найти.
При возврате значений из COM, включая значения свойств, такая же беда - все значения Неопределено превращаются в -2147352572
Вероятно связанная проблема https://github.com/EvilBeaver/OneScript/issues/1597
Дед мороз, сделаешь сборку 1.9.4 с этими фиксами на новый год? А то я все еще продолжаю находить повреждения в коде скрипта, вызванные этими ошибками. Уже скоро 20 шт будет.
Да, как раз собираюсь сегодня-завтра
@tormozit выпущено.
@Mr-Rm я же правильно понимаю, что это можно закрыть?
Проверил. Исправлено.