Приветствую!
ГИС Конструктор для Qt Designer x64 (версия 12.3.0), ОС Astra Linux
При попытке восстановления объекта из записи, сохраненной при помощи АПИ ГИС Конструктор версий 11.10.5 и 12.2.0, приложение аварийно завершает работу.
Пример для формирования файла с записью объекта (необходимо запускать на версии 11.10.5 или 12.2.0):
Пример для восстановления объекта (необходимо запускать на версии 12.3.0):
Результат выполнения восстановления на 12.3.0:
С уважением,
Матвеев П.В.
ГИС Конструктор для Qt Designer x64 (версия 12.3.0), ОС Astra Linux
При попытке восстановления объекта из записи, сохраненной при помощи АПИ ГИС Конструктор версий 11.10.5 и 12.2.0, приложение аварийно завершает работу.
Пример для формирования файла с записью объекта (необходимо запускать на версии 11.10.5 или 12.2.0):
Код |
---|
#include <QString> #include <QDebug> #include <QFile> #include <QIODevice> #include "mapapi.h" #include "sitapi.h" #include "rscapi.h" #include "mapcreat.h" #include "maptype.h" void dumpObject(HOBJ hobj, QString file) { long int len = mapGetObjectRecordLength(hobj); char * buff = new char[len]; mapGetObjectRecord(hobj, buff, len); QFile dumpfile(file); if (dumpfile.open(QIODevice::WriteOnly)) { qint64 written = dumpfile.write(buff, len); if (written < len) { qDebug()<<"write error"; } else { qDebug()<<"write " << len; } } else { qDebug()<<"open error"; } dumpfile.close(); } // тест создания дампа объекта для последующего восстановления int main(int argc, char ** argv) { QString* siteName = new QString("/home/user/temp/testCreateObjDump.sitx"); QString* rscName = new QString("/home/user/temp/operator.rsc"); CREATESITEUN cs; memset((void*) &cs, 0, sizeof(cs)); cs.Length = sizeof(CREATESITEUN); cs.EllipsoideKind = 9; cs.MapType = 16; HMAP hmap = mapCreateSiteUn((const WCHAR*) siteName->constData(), (const WCHAR*) rscName->constData(), &cs); if (hmap != 0) { HOBJ hobj = mapCreateObject(hmap); if (hobj != 0) { //создадим объект if (mapRegisterObjectByKey(hobj, "009991001001") != 0) { double x = 500.; double y = 500.; mapAppendPointPlane(hobj, x, y, 0); mapAppendPointPlane(hobj, x, y, 0); long rc = mapCommitObject(hobj); if (rc == 0) { qDebug() << "mapCommitObject error"; } else { dumpObject(hobj, "/tmp/objdump.bin"); } } else { qDebug() << "mapRegisterObjectByKey error"; } //освобождаем объект mapFreeObject(hobj); } else { qDebug() << "mapCreateObject error"; } mapCloseMap(hmap); } } |
Код |
---|
#include <QString> #include <QDebug> #include <QFile> #include <QIODevice> #include <QByteArray> #include "mapapi.h" #include "sitapi.h" #include "rscapi.h" #include "mapcreat.h" #include "maptype.h" HOBJ restoreObject(HMAP hmap, QString file) { HOBJ obj = 0; QFile dumpfile(file); if (dumpfile.open(QIODevice::ReadOnly)) { QByteArray blob = dumpfile.readAll(); qDebug()<<"read " << blob.size(); obj = mapPutObjectRecord(hmap, 0, blob.constData(), blob.size(), 0); if (obj!=0) { mapCommitObject(obj); } else { qDebug()<<"mapPutObjectRecord error"; } } else { qDebug()<<"open error"; } return obj; } // тест восстановления объекта int main(int argc, char ** argv) { QString* siteName = new QString("/home/user/temp/testRestoreObjDump.sitx"); QString* rscName = new QString("/home/user/temp/operator.rsc"); CREATESITEUN cs; memset((void*) &cs, 0, sizeof(cs)); cs.Length = sizeof(CREATESITEUN); cs.EllipsoideKind = 9; cs.MapType = 16; HMAP hmap = mapCreateSiteUn((const WCHAR*) siteName->constData(), (const WCHAR*) rscName->constData(), &cs); if (hmap != 0) { HOBJ hobj = restoreObject(hmap, "/tmp/objdump.bin"); if (hobj != 0) { //освобождаем объект mapFreeObject(hobj); } else { qDebug() << "restoreObject error"; } mapCloseMap(hmap); } } |
Результат выполнения восстановления на 12.3.0:
Код |
---|
(gdb) bt #0 0x00007ffff747e7b0 in TObjectSemn::IsCorrect() () from /home/user/libs/libqdmapacces.so #1 0x00007ffff747dc00 in TSemnEdit::Load(TObjectSemn) () from /home/user/libs/libqdmapacces.so #2 0x00007ffff732f43f in mapPutObjectRecord () from /home/user/libs/libqdmapacces.so #3 0x0000000000401ca0 in restoreObject(long, QString) () #4 0x0000000000401e8c in main () |
С уважением,
Матвеев П.В.