На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Аварийное завершение при попытке восстановления объекта из записи

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
Аварийное завершение при попытке восстановления объекта из записи
 
Приветствую!

ГИС Конструктор для 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);
   }

}

Пример для восстановления объекта (необходимо запускать на версии 12.3.0):
Код
#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 ()

С уважением,
Матвеев П.В.
 
Ошибка исправлена в обновленной версии, доступной на сайте.
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности