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

Ошибка конвертации Bmp -> Rsw

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Ошибка конвертации Bmp -> Rsw, Используется функция LoadBmpToRstByPlace из mappicex.h
 
При выполнении команды LoadBmpToRstByPlace, из библиотеки, выдает ошибку.
Размер изображения 22мб
4к Пикс/4к пикселей
Ошибка из лога System.Runtime.InteropServices.SEHException (0x80004005)
Ругается, как показано в скрине, на картинку.
Вопрос, что я делаю не так?
 
Цитата
Алесь Побожный написал:
При выполнении команды LoadBmpToRstByPlace, из библиотеки, выдает ошибку.Размер изображения 22мб4к Пикс/4к пикселейОшибка из лога System.Runtime.InteropServices.SEHException (0x80004005)Ругается, как показано в скрине, на картинку.Вопрос, что я делаю не так?
Добрый день!
Просьба уточнить в какой программе и версии работаете?
Изменено: Елена Кузнецова - 18.07.2022 11:04:10
 
Цитата
Елена Кузнецова написал:
Цитата
Алесь Побожный написал:
При выполнении команды LoadBmpToRstByPlace, из библиотеки, выдает ошибку.Размер изображения 22мб4к Пикс/4к пикселейОшибка из лога System.Runtime.InteropServices.SEHException (0x80004005)Ругается, как показано в скрине, на картинку.Вопрос, что я делаю не так?
Добрый день!
Просьба уточнить в какой программе и версии работаете?
GisToolKit Active 14, программа разработана под этой технологией, язык С++/Сli
 
Прототип API-функции используется из mappicex.h или вы сами его объявили?
Покажите код вызова (полностью - включая как объявляются переменные, передаваемые в функцию).
Цитата
Алесь Побожный написал:
язык С++/Сli
Приложение .Net, я так полагаю?

Где располагаются библиотеки ГИС-ядра?
Вы используете только MAPAPI-вызовы или еще и компоненты GisToolKit Active (регистрируется ли библиотека *.OCX в системе)?

и уточните, пожалуйста версию GisToolKit Active 14 (точная версия указана в дистрибутиве, откуда проводилась инсталляция - посмотреть можно либо при запуске setup.exe, либо прочитать в шапке файла readme.txt), а также версию библиотек ГИС-ядра - gis64acces.dll и gis64picex.dll (посмотреть можно в свойствах файла).
 
Цитата
Денис Вицко написал:
Прототип API-функции используется из mappicex.h или вы сами его объявили?
Код
      [DllImport("gis32picex.dll", EntryPoint = "LoadBmpToRstByPlace", CharSet = CharSet::Ansi, ExactSpelling = true, CallingConvention = CallingConvention::StdCall)]
      static long int LoadBmpToRstByPlace(int hmap, int handle,
         String ^bmpname,
         String ^rstname,
         double scale, 
         DFRAME *frame); DFRAME *frame;
Цитата
Денис Вицко написал:
Покажите код вызова (полностью - включая как объявляются переменные, передаваемые в функцию).
Код
   
        //структура
        struct DFRAME
   {
      double X1;
      double Y1;

      double X2;
      double Y2;
   };
                 //переменные
      String ^bmpname = (Application::StartupPath) + "\\Maps\\bmp\\toConvert.bmp";
      String ^rstname = (Application::StartupPath) + "\\Maps\\rst\\converted1.rst";


private: System::Void toolStripButton1_Click_1(System::Object^  sender, System::EventArgs^  e) {
   frame = new DFRAME();
   frame->X1 = 54;
   frame->Y1 = 26;
   frame->X2 = 55;
   frame->Y2 = 27;
   Bug = bmpname;
   WriteLog(Bug, D);
   try
   {           //вызов
      if (LoadBmpToRstByPlace(1, 0, bmpname, rstname, 500, frame) == 0)
      {
         throw;
         //throw gcnew System::Exception("")
      }
   }
   catch (Exception ^ex)
   {
      Bug = "ошибка конвертации BMP в RST - " + ex;
      WriteLog(Bug, E);
   }
}
Цитата
Денис Вицко написал:
Приложение .Net, я так полагаю?
Верно.

Цитата
Денис Вицко написал:
Где располагаются библиотеки ГИС-ядра?
Пути к папкам библиотек x32/x64 лежат в системных переменных в path.
Если локально для программы - в папках Debug/Release актуальной версии программы.

Цитата
Денис Вицко написал:
Вы используете только MAPAPI-вызовы или еще и компоненты GisToolKit Active (регистрируется ли библиотека *.OCX в системе)?
Компоненты и MAPAPI-вызовы в одной программе использую. Библиотека ocx в реестре есть.
И то и другое достаточно успешно используется.
         
Цитата
Денис Вицко написал:
и уточните, пожалуйста версию GisToolKit Active 14
Версия GTK Active - v.14.0.6.0 , версия библиотек gis64acces.dll и gis64picex.dll - 14.3.3.1.
Изменено: Алесь Побожный - 18.07.2022 15:04:37
 
Цитата
Алесь Побожный написал:
[DllImport("gis32picex.dll", EntryPoint = "LoadBmpToRstByPlace", CharSet = CharSet::Ansi, ExactSpelling = true, CallingConvention = CallingConvention::StdCall)]
     static long int LoadBmpToRstByPlace(int hmap, int handle,
        String ^bmpname,
        String ^rstname,
        double scale,
        DFRAME *frame); DFRAME *frame;

А нельзя в С++/Сli воспользоваться штатным описанием функции из mappicex.h? Обязательно надо писать обертку в виде [DllImport]?
Специалистом в .Net не являюсь, поэтому не могу сказать, насколько корректно String^ передавать в неуправляемый код в качестве указателя на массив символов.
Тут не должен применяться маршалинг по аналогии с C#?

Написанный Вами прототип будет работать только в x32 приложениях. Компилировать его надо будет именно как x32, AnyCPU использовать нельзя.
Рекомендую типы хэндлов (HMAP, HOBJ, HSITE, HMESSAGE и др.) объявлять как IntPtr, так как в x64 они будут занимать 8 байт, а в x32 - 4 байта.
Имена библиотек объявить константой, определяемой через дефайн, соответствующий определённой разрядности собираемого приложения ("gis32picex.dll"/"gis64picex.dll").

Далее самой главное - вызов.
Цитата
//    Конвертор Bmp -> Rsw
//    hmap -  идентификатор открытых данных
//    handle  - диалог визуального сопровождения процесса обработки;
//    bmpname - имя BMP-файла;
//    rstname - имя RST-файла;
//    scale   - масштаб создаваемого растра;
//    frame   - габариты растра(в метрах на местности)
//    При ошибке возвращает ноль
//
//    Диалогу визуального сопровождения процесса обработки посылаются
//    сообщения:
//    -  (WM_PROGRESSBAR) Извещение об изменении состояния процесса
//       WPARAM - текущее состояние процесса в процентах (0% - 100%)
//       Если функция-отклик возвращает WM_PROGRESSBAR, то процесс завершается.
//
//    -  (WM_ERROR) Извещение об ошибке
//       LPARAM - указатель на структуру ERRORINFORMATION
//       Структура ERRORINFORMATION описана в picexprm.h,
//       WM_PROGRESSBAR и WM_ERROR - в maptype.h

_PICIMP long int _PICAPI LoadBmpToRstByPlace(HMAP hmap, HMESSAGE handle,
                                      const char * bmpname,
                                      const char * rstname,
                                      double scale,
                                      DFRAME *frame);

_PICIMP long int _PICAPI LoadBmpToRstByPlaceUn( HMAP Map, HMESSAGE Handle,
                                       const WCHAR * BmpName,
                                       const WCHAR * RstName,
                                       double scale,
                                       DFRAME *frame);

Параметр hmap - это идентификатор открытых данных. Единицей он никак быть не может, так как является идентификатором экземпляра класса внутри ГИС-ядра, работающего с открытой картой.
HMAP Вы получаете, когда отрываете пространственные данные, например, с помощью функции
Цитата
 // Открыть данные с автоматическим определением их типа
 // (векторные,растровые,матричные...)
 // name - имя открываемого файла (MAP, SIT, MTW, RSW, MPT) в кодировке UNICODE
 // mode - режим чтения/записи (GENERIC_READ, GENERIC_WRITE или 0)
 // GENERIC_READ - все данные только на чтение, при этом не открываются
 // файлы \Log\name.log и \Log\name.tac - протокол работы и журнал транзакций
 // error - после выполнения функции переменная содержит код ошибки
 //        (когда HMAP равен 0) или 0; коды ошибок приведены в maperr.rh
 // password - пароль доступа к данным из которого формируется 256-битный код
 //            для шифрования данных (при утрате пароля данные не восстанавливаются)
 // size     - длина пароля в байтах !!!
 // Передача пароля необходима, если при создании карты он был указан.
 // Если пароль не передан, а он был указан при создании,
 // то автоматически вызывается диалог scnGetMapPassword из mapscena.dll (gisdlgs.dll)
 // Если выдача сообщений запрещена (mapIsMessageEnable()), то диалог
 // не вызывается, а при отсутствии пароля происходит отказ открытия данных
 // После завершения использования карты необходимо освободить ресурсы функцией mapCloseData
 // При ошибке возвращает ноль

_MAPIMP HMAP _MAPAPI mapOpenAnyDataPro(const WCHAR *name, long int mode, long int *error,
                                      const WCHAR *password, long int size);

Цитата
Алесь Побожный написал:
Пути к папкам библиотек x32/x64 лежат в системных переменных в path.Если локально для программы - в папках Debug/Release актуальной версии программы.

Проверьте, не подгружаются ли в процесс одновременно библиотеки из разных мест расположения.
Такое возможно, например, когда в приложении есть использование компонентов - тогда gisaccess.dll будет загружена не процессом, а библиотекой *.ocx, а все остальные библиотеки будут подгружаться процессом по правилам Windows.
Использование библиотек ГИС-ядра, находящихся в разных местах, равно как и использование библиотек ГИС-ядра из разных сборок, - недопустимо и может приводить в AccessViolation.
Применяйте функцию mapSetPathShellUn в самом начале работы приложения:

Цитата
// Установить/Запросить путь к директории приложения, где
// располагаются вспомогательные файлы для функционирования
// ГИС-ядра (библиотеки ядра, библиотеки отрисовки программируемых знаков *.iml,
// файлы базы данных epsg.*, wmslist_xx.xml, xml-схемы и другие файлы)
// Рекомендуется устанавливать при запуске приложения

_MAPIMP void _MAPAPI mapSetPathShellUn(const WCHAR* path);
 
Цитата
Алесь Побожный написал:
При выполнении команды LoadBmpToRstByPlace, из библиотеки, выдает ошибку.
Размер изображения 22мб
4к Пикс/4к пикселей
Ошибка из лога System.Runtime.InteropServices.SEHException (0x80004005)
Ругается, как показано в скрине, на картинку.
Вопрос, что я делаю не так?

Здравствуйте!
Тестирование библиотек GTK выполнялось на 32-х разрядном консольном приложении, созданном в VC2019.
Исходный текст приложения представлен ниже.
В качестве тестируемых растров применялись файлы BMP размером 904 КБ, 3.1 МБ и 72 МБ.

Функция LoadBmpToRstByPlace обеспечила успешный импорт всех трех файлов BMP.
Код
int main()
{
 
  char inputFileName[MAX_PATH];    inputFileName [0] = 0;
  char outputFileName[MAX_PATH];   outputFileName[0] = 0;

  StrCopy(inputFileName, "D:\\222\\file.bmp", sizeof(inputFileName));
  StrCopy(outputFileName, "D:\\222\\file.rsw", sizeof(outputFileName));

  HINSTANCE libinst;
  typedef long int (WINAPI* F_func)(HMAP, HMESSAGE, const char*, const char*, double, DFRAME*);

  F_func lpfn_LoadBmpToRstByPlaceUn = (F_func)mapLoadLibrary(MAPPICEXLIB, &libinst, "LoadBmpToRstByPlace");

  int rez = 0;
  if (lpfn_LoadBmpToRstByPlaceUn != 0)
  {
    HMAP hMap = 0;
    HMESSAGE handle = 0;
    double scale = 100000;
    DFRAME frame;
    frame.X1 = 0;
    frame.Y1 = 0;
    frame.X2 = 100;
    frame.Y2 = 100;

    rez = (*lpfn_LoadBmpToRstByPlaceUn)(hMap, handle, inputFileName, outputFileName, scale, &frame);
  }

  // Выгрузка библиотеки
  if (libinst)
    mapFreeLibrary(libinst);

  if (outputFileName)
    std::cout << "Successful execution\n";
  else
    std::cout << "Execution error!\n";

  std::cin.get();
}
1.png (21.59 КБ)
Страницы: 1
Читают тему (гостей: 1)



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

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