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 потоков нет!" (как и юникода, да и вообще всего), но я не верю.