Тема: ARX и Windows XP

Подскажите пожалста, вот када пишу и компилирую в WinXp
Акад не фаталит, но и примитив не создает.
Подскажите как отрисовать в ХР?
AcDbObjectId createLine()
{
AcGePoint3d startPt(4.0, 2.0, 0.0);
AcGePoint3d endPt(10.0, 7.0, 0.0);
AcDbLine *pLine = new AcDbLine(startPt, endPt);
AcDbBlockTable *pBlockTable = new AcDbBlockTable;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord = new AcDbBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId lineId;
pBlockTableRecord->appendAcDbEntity(lineId, pLine);
pBlockTableRecord->close();
pLine->close();
return lineId;
}

Re: ARX и Windows XP

Всё должно нормально создаваться. Возможно, ты не заметил созданный отрезок.
И ещё у тебя ошибка в коде. Не нужно создавать новые объекты

AcDbBlockTable *pBlockTable = new AcDbBlockTable;
…
AcDbBlockTableRecord *pBlockTableRecord = new AcDbBlockTableRecord;

Просто используй указатели. После использования методов AcDbDatabase::getSymbolTable() и AcDbBlockTable::getAt() эти указатели будут содержать адреса существующих в AutoCAD’е объектов AcDbBlockTable и AcDbBlockTableRecord.

Re: ARX и Windows XP

> Сергей
1) Проанализируй коды возврата.
2)
a) AcDbBlockTable *pBlockTable = new AcDbBlockTable;
b) AcDbBlockTableRecord *pBlockTableRecord = new AcDbBlockTableRecord;
Здесь оператор new не нужен - будут утечки памяти.
3) Если код выполняется из контекста приложения, то нужно блокировать документ.

Re: ARX и Windows XP

почему-то када я убираю оператор new из строчек
AcDbBlockTable *pBlockTable = new AcDbBlockTable;

AcDbBlockTableRecord *pBlockTableRecord = new AcDbBlockTableRecord;
, то Акад выдаёт ошибку и выкидывает меня...
не могли бы подсказать в чём проблема? А в 2000 винде все нормально.

Re: ARX и Windows XP

> Сергей
Это означает, что следующие за указанными строки у тебя в программе возвращают код ошибки. Проверь его. И если он не Acad::eOk, то завершай выполнение, а не пытайся развалить AutoCAD. Еще раз проверь в каком контексте выполняется приложение!

Re: ARX и Windows XP

Весь этот код взят из Samples-ов Акада, а контекст толдько этот кусок. При трассировке видно, что не создается
pBlockTableRecord и соответсвенно Си
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
не может обработатьэту строчку. Дак почему же
AcDbBlockTableRecord *pBlockTableRecord;
не определяет адрес?

Re: ARX и Windows XP

1) Как ты регистрируешь команду?
2) Какой же код ошибки возвращается?

Re: ARX и Windows XP

Ошибка - Unhandled Access Violation Reading 0xcccccccd0 Exception.

Re: ARX и Windows XP

Речь идёт об ошибке, возвращаемой функцией:

Acad::ErrorStatus es;
AcDbBlockTable *pBlockTable = NULL;
es = acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord = NULL;
es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId lineId;
es = pBlockTableRecord->appendAcDbEntity(lineId, pLine);
pBlockTableRecord->close();
pLine->close();

Re: ARX и Windows XP

Спасибо за код, но проблема в том, что в строчке

pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);

pBlockTableRecord не получает никакого адреса, тобишь 0х0000000, и соответственно не получается дальше обработать код...почему же не getAt не работает?

Re: ARX и Windows XP

Посмотри какой код ошибки возвращает getAt() (что в es?).

Re: ARX и Windows XP

Возвращает eLockViolation

Re: ARX и Windows XP

Приведи фрагмент кода, где ты регистрируешь команду?

Re: ARX и Windows XP

> Сергей
Черт побери! Сколько раз нужно повторить вопрос о контексте и подсказать необходимость выполнить блокировку документа:

AcAxDocLock lock(acdbHostApplicationServices()->workingDatabase());
if (lock.lockStatus == Acad::eOk) {
 // Здесь твой код
}

Re: ARX и Windows XP

> Александр Ривилис
Спасибо, за помощь!!!Действительно нада было блокировать документ!Ещё раз спасибо!Теперь все отрисовывает