Method '~' of object '~' failed

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Method '~' of object '~' failed

Сообщение Jack Ferre » 12.04.2014 (Сб) 18:19

Давно наблюдаю в своей программе неведому ошибку. Неводому - потому что на всех окошках крутится WndProc и узреть msgbox с ошибкой не получается.
Также в программе имеется клиент-сервер. После того, как я стал делать рассылку, при определенных событиях натолкнулся на
Method 'SendData' of object 'IMSWinsockControl' failed

Ошибка появляется если вызвать SendData из другого потока или Call-back функции.
Предположил, что неведома ошибка тоже с этим связана. И после целого дня работы программы из IDE обнаружил
Method 'SetVariables' of object 'IShockwaveFlash' failed

Причина появления та же, но с вероятностью менее 1%.

Почему так? Как с этим бороться?
Ладно бы методы не могли вызываться, но они именно фейлятся (при следующем успешном IMSWinsockControl.SendData на клиент приходит отправленное сфейлившимся методом данные + еще несколько байт хлама).

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Method '~' of object '~' failed

Сообщение Vi » 14.04.2014 (Пн) 8:59

Jack Ferre писал(а):Почему так? Как с этим бороться?
Ладно бы методы не могли вызываться, но они именно фейлятся (при следующем успешном IMSWinsockControl.SendData на клиент приходит отправленное сфейлившимся методом данные + еще несколько байт хлама).

AFAIK, все методы в СОМе теперь имеют код возврата, обозначенный HRESULT. Это значит, что метод может вернуть код ошибки до прихода метода на исполнение. Эта ошибка достаточно информативна и нужно смотреть её значение. Или обрабатывать исключение как Повторить, но тут есть опасность впасть в бесконечное повторение.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Method '~' of object '~' failed

Сообщение Хакер » 14.04.2014 (Пн) 10:10

Vi писал(а):Это значит, что метод может вернуть код ошибки до прихода метода на исполнение.

Что? :?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Method '~' of object '~' failed

Сообщение Jack Ferre » 14.04.2014 (Пн) 14:35

Vi писал(а):AFAIK, все методы в СОМе теперь имеют код возврата, обозначенный HRESULT.

И как мне его раздобыть в VB? (LastDllError = 0).
Vi писал(а):Эта ошибка достаточно информативна и нужно смотреть её значение.

Но ведь проблемные методы прекрасно вызываются из основного потока приложения. Экземпляр инициализирован, аргументы валидные. Чтобы не случилось внутри вызываемого метода, я не смогу на это повлиять.

Когда столкнулся с ошибкой "Method 'SendData' of object 'IMSWinsockControl' failed", придумал костыль - пересылать данные VB > ShockwaveFlashControl > VB > WinsockControl, но выяснилось, что Flash тоже фейлится.
Vi писал(а):Или обрабатывать исключение как Повторить, но тут есть опасность впасть в бесконечное повторение.

Раз с момента прошлого вызова ничего не изменилось, думаю бесконечность гарантирована.

Думаю беда не с конкретными методами, а именно вызовом их из другого потока.
При работе с потоками встречается очень много ошибок и бреда (на мой взгляд), например:
Код: Выделить всё
Public Function VBStrFromAnsiPtr(ByVal lpStr As Long) As String
    ...
    Dim cChars As Long
    cChars = lstrlen(lpStr)       !!!ТУТ ОШИБКА - Overflow!!!
    ...
End Function

1. lpStr - уже проверен на overflow.
2. lstrlen - функция API as Long, и больше лонга вернуть не может.
3. Можно продолжить выполнение как ни в чем не бывало.

Я не жду решения конкретно этой проблемы, но хотелось чтобы местные форумчане поделились опытом успешной работы с потоками. Может кто посоветует статью.
Я находил множество примеров реализации "правильной" работы с потоками кодом VB, либо подключением самопальной DLL, но все они только и знают что падать. Часто можно увидеть "В VB потоков нет!" (как и юникода, да и вообще всего), но я не верю.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Method '~' of object '~' failed

Сообщение Vi » 14.04.2014 (Пн) 15:41

Хакер писал(а):Что? :?

Я имею в виду - до исполнения на сервере. А что это так необычно? Хотя может быть и в процессе передачи параметров в метод случается ошибка, так и в этом случае передачи управления в сервер не будет. Грубо говоря, если курок сломался, то выстрела не будет, хотя и заряжен патрон без пороха.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Method '~' of object '~' failed

Сообщение Vi » 14.04.2014 (Пн) 15:45

Jack Ferre писал(а):Но ведь проблемные методы прекрасно вызываются из основного потока приложения. Экземпляр инициализирован, аргументы валидные. Чтобы не случилось внутри вызываемого метода, я не смогу на это повлиять.

Если ты точно уверен, что проблема в потоках, то так и нужно ставить вопрос.
Jack Ferre писал(а):Раз с момента прошлого вызова ничего не изменилось, думаю бесконечность гарантирована.

Да нет, если произошёл затык в бутылочном горлышке, то обработка вполне возможна после рассасывания линий протекания через неё. Я имел в виду, что если ошибка произойдёт правильно и не случайно, то она и будет повторяться и дальше. Вот это-то и есть опасность.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Method '~' of object '~' failed

Сообщение Хакер » 15.04.2014 (Вт) 10:48

Vi писал(а):Я имею в виду - до исполнения на сервере.

Я не думал, что речь о вызовах через границы апартамента.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 52

    TopList