Ошибка при использовании WblockCloneObjects

Автор Тема: Ошибка при использовании WblockCloneObjects  (Прочитано 31016 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Добрый день!
Ниже функция которая вытягивает блок из нужного файла. На одном компе возникает ошибка "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена". Не могу понять в чем причина, у меня на компе все работает.
Код - vb.net [Выбрать]
  1. Friend Shared Function AddBlockRecordToActiveDatabase(ByVal BlockName As String, ByVal path As String) As Boolean
  2.         Dim key As Boolean = False
  3.         Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  4.         Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  5.         Dim PathString As String = GetPath(path)
  6.         ed.WriteMessage(vbCrLf & "Путь файла=" & PathString & vbCrLf)
  7.         ed.WriteMessage(vbCrLf & "Имя блока=" & BlockName & vbCrLf)
  8.         If File.Exists(PathString) Then
  9.             '   Using doclock As DocumentLock = doc.LockDocument()
  10.             Using SourceDb As New Database(False, True)
  11.                 Try
  12.                     SourceDb.ReadDwgFile(PathString, System.IO.FileShare.Read, True, "")
  13.             ed.WriteMessage(vbCrLf & "Шаг 1" & vbCrLf)
  14.                     Dim RequestedBlockIds As New ObjectIdCollection()
  15.                     ed.WriteMessage(vbCrLf & "Шаг 2" & vbCrLf)
  16.                     Using acTrans As Transaction = SourceDb.TransactionManager.StartTransaction()
  17.                         ed.WriteMessage(vbCrLf & "Шаг 3" & vbCrLf)
  18.                         Dim bt As BlockTable = DirectCast(acTrans.GetObject(SourceDb.BlockTableId, OpenMode.ForRead), BlockTable)
  19.                         If bt.Has(BlockName) Then
  20.                             ed.WriteMessage(vbCrLf & "Шаг 4" & vbCrLf)
  21.                             Dim btr As BlockTableRecord = DirectCast(acTrans.GetObject(bt(BlockName), OpenMode.ForRead), BlockTableRecord)
  22.                             ed.WriteMessage(vbCrLf & "Шаг 5" & vbCrLf)
  23.                             RequestedBlockIds.Add(btr.ObjectId)
  24.                             ed.WriteMessage(vbCrLf & "Шаг 6" & vbCrLf)
  25.                             'btr.Dispose()
  26.                             key = True
  27.                         End If
  28.                         ed.WriteMessage(vbCrLf & "Шаг 7" & vbCrLf)
  29.                         '  bt.Dispose()
  30.                         acTrans.Commit()
  31.                     End Using
  32.                     If RequestedBlockIds.Count > 0 Then
  33.                         ed.WriteMessage(vbCrLf & "Шаг 8" & vbCrLf)
  34.                         Dim ActiveDb As Database = doc.Database
  35.                         ed.WriteMessage(vbCrLf & "Шаг 9" & vbCrLf)
  36.                         Dim mapping As New IdMapping()
  37.                         ed.WriteMessage(vbCrLf & "Шаг 10" & vbCrLf)
  38.                         SourceDb.WblockCloneObjects(RequestedBlockIds, ActiveDb.BlockTableId, mapping, DuplicateRecordCloning.Ignore, False)
  39.                         ed.WriteMessage(vbCrLf & "Шаг 11" & vbCrLf)
  40.                     End If
  41.                     ed.WriteMessage(vbCrLf & "Шаг 12" & vbCrLf)
  42.                     '   RequestedBlockIds = Nothing
  43.                 Catch ex As System.Exception
  44.                     ed.WriteMessage("Ошибка: Поврежден файл " & PathString & vbCrLf)
  45.                     ed.WriteMessage(vbCrLf & ex.Message & path & vbCrLf)
  46.                     ed.WriteMessage(vbCrLf & "Шаг 13" & vbCrLf)
  47.                     key = False
  48.                 End Try
  49.             End Using
  50.             ed.WriteMessage(vbCrLf & "Шаг 14" & vbCrLf)
  51.             'SourceDb.Dispose()
  52.             ed.WriteMessage(vbCrLf & "Шаг 15" & vbCrLf)
  53.             '    End Using
  54.             ed.WriteMessage(vbCrLf & "Шаг 16" & vbCrLf)
  55.             Return key
  56.         Else
  57.             ed.WriteMessage("Ошибка: Отсутствует файл " & PathString & vbCrLf)
  58.             Return key
  59.         End If
  60.     End Function
   

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Начни с чтения моей подписи о правилах форматирования кода на форуме.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Вроде поправил.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вроде поправил.
Да. С форматированием теперь всё нормально. Теперь пара вопросов:
1) Откуда уверенность, что ошибка возникает в WblockCloneObjects?
2) Что печаталось до этого сообщения?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Зачем отключили блокировку документа?

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Уверенность связанна с записями ниже. Получается вот, что (до 10 шага все нормально, ниже 13 уже ничего не пишет, между 10 и 13 тоже ничего не пишет):
Шаг 10
Ошибка: Поврежден файл X:\Supp\Support\Cables\Data\База блоков.dwg
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том,
что другая память повреждена.База блоков.dwg
Шаг 13

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Александр Пекшев aka Modis,
Это были эксперименты. Блокировка на ошибку не влияет.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
1) Поменяй SourceDb.WblockCloneObjects на ActiveDb.WblockCloneObjects
2) Поэкспериментируй с заменой DuplicateRecordCloning.Ignore на DuplicateRecordCloning.Replace
3) Поставь блокировку doc перед WblockCloneObjects
4) убери TRY/CATCH, чтобы увидеть системную ошибку.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Может это связано как-то с размером файла? У меня файл получается больше 10мб?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Может это связано как-то с размером файла? У меня файл получается больше 10мб?
Это вряд-ли связано с файлом-источник. Если вы при отлове ошибки написали "Файл испорчен", то это еще не истина )

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #10 : 09-02-2016, 13:20:10 »
Может это связано как-то с размером файла? У меня файл получается больше 10мб?
Нет. Если ты вручную средствами AutoCAD можешь вставить этот блок, то и через API это должно работать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #11 : 09-02-2016, 13:21:06 »
Если вы при отлове ошибки написали "Файл испорчен", то это еще не истина )
100%. Поэтому я и предложил убрать TRY/CATCH.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при использовании WblockCloneObjects
« Ответ #12 : 09-02-2016, 13:23:06 »
Volody1983
Убедись, что исходный файл (откуда ты берёшь блок) нормальный. Для этой цели попробуй открыть его в AutoCAD через команду _RECOVER, а потом выполни _AUDIT.

P.S.: Кстати ошибка может быть совсем в другом месте кода. Просто она проявляется именно в этот момент, но память у тебя испорчена раньше.
Поэтому тебе придётся сделать тестовую команду с минимальным кодом для проверки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Volody1983Автор темы

  • ADN OPEN
  • **
  • Сообщений: 52
  • Карма: 0
Re: Ошибка при использовании WblockCloneObjects
« Ответ #13 : 09-02-2016, 13:29:33 »
Александр Ривилис,
Убеждался и с помощью _audit и всеми другими возможными вариантами. На эту фразу "ed.WriteMessage("Ошибка: Поврежден файл " & PathString & vbCrLf)" не обращайте внимание, она для пользователей.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Ошибка при использовании WblockCloneObjects
« Ответ #14 : 09-02-2016, 13:30:54 »
Ну попробуй хотя-бы для начала ex.Message заменить на ex.StackTrace - там вроде пишется номер строки в которой возникла ошибка
2) Поэкспериментируй с заменой DuplicateRecordCloning.Ignore на DuplicateRecordCloning.Replace
И это в первую очередь пробуй