При выполнении команды LoadBmpToRstByPlace, из библиотеки, выдает ошибку. Размер изображения 22мб 4к Пикс/4к пикселей Ошибка из лога System.Runtime.InteropServices.SEHException (0x80004005) Ругается, как показано в скрине, на картинку. Вопрос, что я делаю не так?
Алесь Побожный написал: При выполнении команды LoadBmpToRstByPlace, из библиотеки, выдает ошибку.Размер изображения 22мб4к Пикс/4к пикселейОшибка из лога System.Runtime.InteropServices.SEHException (0x80004005)Ругается, как показано в скрине, на картинку.Вопрос, что я делаю не так?
Добрый день! Просьба уточнить в какой программе и версии работаете?
Алесь Побожный написал: При выполнении команды LoadBmpToRstByPlace, из библиотеки, выдает ошибку.Размер изображения 22мб4к Пикс/4к пикселейОшибка из лога System.Runtime.InteropServices.SEHException (0x80004005)Ругается, как показано в скрине, на картинку.Вопрос, что я делаю не так?
Добрый день! Просьба уточнить в какой программе и версии работаете?
GisToolKit Active 14, программа разработана под этой технологией, язык С++/Сli
Прототип API-функции используется из mappicex.h или вы сами его объявили? Покажите код вызова (полностью - включая как объявляются переменные, передаваемые в функцию).
Где располагаются библиотеки ГИС-ядра? Вы используете только MAPAPI-вызовы или еще и компоненты GisToolKit Active (регистрируется ли библиотека *.OCX в системе)?
и уточните, пожалуйста версию GisToolKit Active 14 (точная версия указана в дистрибутиве, откуда проводилась инсталляция - посмотреть можно либо при запуске setup.exe, либо прочитать в шапке файла readme.txt), а также версию библиотек ГИС-ядра - gis64acces.dll и gis64picex.dll (посмотреть можно в свойствах файла).
Алесь Побожный написал: [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);
Параметр 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-схемы и другие файлы) // Рекомендуется устанавливать при запуске приложения
Алесь Побожный написал: При выполнении команды LoadBmpToRstByPlace, из библиотеки, выдает ошибку. Размер изображения 22мб 4к Пикс/4к пикселей Ошибка из лога System.Runtime.InteropServices.SEHException (0x80004005) Ругается, как показано в скрине, на картинку. Вопрос, что я делаю не так?
Здравствуйте! Тестирование библиотек GTK выполнялось на 32-х разрядном консольном приложении, созданном в VC2019. Исходный текст приложения представлен ниже. В качестве тестируемых растров применялись файлы BMP размером 904 КБ, 3.1 МБ и 72 МБ.
Функция LoadBmpToRstByPlace обеспечила успешный импорт всех трех файлов BMP.