У меня была похожая проблема с падением, на старой версии ГИСКонструктор, и тоже на одной конкретной карте, на новой разработчики не смогли воспроизвести. И тоже вроде падало на каком-то проходе. Лечил изменением CMEQUAL с точного названия на *паттерн* и паттерн* (содержит/начинается с)
Если пользователь ввёл, допустим,
Код
Псков
, то я искал
Код
"ПСКОВ*"
или
Код
"*ПСКОВ*"
в зависимости от выбранного пользователя метода поиска (начинается с/содержит)
Владимир Егоров написал: Лечил изменением CMEQUAL с точного названия на *паттерн* и паттерн* (содержит/начинается с)
Столкнулся с аналогичной проблемой при использовании старого ГИС-Конструктора на OSM-карте Воронежской области, скачанной с сайта КБ "Панорама". Помог ваш совет. Единственное, что после поиска и нахождения 1 или нескольких объектов вызов функции mapFreeObject() приводит к аварийному завершению приложения. Не сталкивался с этим кто-нибудь?
Сергей написал: Единственное, что после поиска и нахождения 1 или нескольких объектов вызов функции mapFreeObject() приводит к аварийному завершению приложения. Не сталкивался с этим кто-нибудь?
Не могли бы Вы прислать маленький автономный пример поиска, чтобы мы могли проанализировать текст программы?
Сергей написал: Единственное, что после поиска и нахождения 1 или нескольких объектов вызов функции mapFreeObject() приводит к аварийному завершению приложения. Не сталкивался с этим кто-нибудь?
Не могли бы Вы прислать маленький автономный пример поиска, чтобы мы могли проанализировать текст программы?
Да, конечно.
Код
// PanoramaUtils::ushortToWChar - преобразование ushort* в WCHAR *
//
auto selectContext = mapCreateMapSelectContext(m_hMap); // m_hMap - хендлер открытой карты
QString searchTitle = titleName; // titleName - исходная строка для поиска как в окне ввода в "Операторе"
// костыль с поиском для указанной версии
#if ((MAPAPIVERSION == 0x111015) && (MAPACCESSVERSION == 20130912))
if (!searchTitle.endsWith(QLatin1String("*")))
searchTitle.append("*");
#endif
mapSelectSemanticAppendUn(selectContext, CMEQUAL, 9, PanoramaUtils::ushortToWChar(searchTitle.utf16()));
auto hObj = mapCreateObject(m_hMap);
const auto cnt = mapSeekSelectObjectCount(m_hMap, selectContext);
auto res = (cnt > 0) ? mapSeekSelectObject(m_hMap, hObj, selectContext, (WO_FIRST | WO_VISUALIGNORE | WO_INMAP)) : 0;
if (res != 0) {
do {
} while (mapSeekSelectObject(m_hMap, hObj, selectContext, WO_NEXT) != 0);
}
mapDeleteObject(hObj); // если cnt > 0, то тут падает
mapDeleteSelectContext(selectContext);
Вы пытаетесь удалить объект с карты, а не освободить ресурсы.
Код
// Удалить объект карты
// Предыдущее состояние объекта сохраняется в резервных
// файлах и может быть восстановлено
// info - идентификатор объекта карты в памяти
// Признак удаления записывается в памяти и в файле
// При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapDeleteObject(HOBJ info);
// Удалить описание объекта векторной карты из памяти
// info - идентификатор объекта карты в памяти
// Для сохранения объекта на карте необходимо
// до вызова mapFreeObject(...) выполнить функцию
// mapCommitObject(...)
// При ошибке возвращает ноль
_MAPIMP void _MAPAPI mapFreeObject(HOBJ info);