Добрый. В настоящий момент я изучаю возможности Git Toolkit. Я использую C# Net core 6. Подключил Gis библиотеки и пытаюсь открыть файл с картой (*.map) в среде Linux, Rider
var mapInPtr = mapOpenDataUn(fullName, 0); if (mapInPtr.IsNull()) throw new MapException($"Некорректный формат данных! Файл: {fullName}"); --> mapInPtr всегда 0x0
Возращается всегда пустой указатель. Лог записывается. В нем всего 2 строки.
Подскажите пожалуйста, как мне провести делальную диагностику причины возврата пустого указателя? Карту проверил. Валидная. Данная ситуация при открытии любой карты.
Лучше воспользоваться более универсальной функцией, которая сразу вернет код ошибки:
Цитата
// Открыть данные с автоматическим определением их типа // (векторные,растровые,матричные...) // 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);
Значение кода можно посмотреть в maperr.rh или попробовать его расшифровать с помощью функции mapErrorMessageLog.
Второй вариант - включить ведение диагностического лога (включенный лог сильно замедляет работу приложения, но выводит подробные сообщения о ходе выполнения):
Цитата
// Открыть запись в диагностический протокол // logname - путь к протоколу диагностической печати, если равен нулю, // то запись идет в \ProgramData\mapdiagnostics.log
_MAPIMP long int _MAPAPI mapOpenDiagnostics(const WCHAR * logname);
// Запросить - открыт ли диагностический протокол
_MAPIMP long int _MAPAPI mapIsDiagnostics();
// Закрыть запись в диагностический протокол
_MAPIMP void _MAPAPI mapCloseDiagnostics();
Если надо дописать в этот лог еще и своё сообщение:
Цитата
// Записать сообщение в диагностический протокол // message - первая часть сообщения // messageex - вторая часть сообщения // type - тип сообщения (>>> MT_ERROR, --> MT_WARNING, MT_INFO, MT_CONTINUE - продолжение) // error - код ошибки, запрошенный у системы (если равен 0, то будет запрошен при выводе сообщения) // value - число, которое будет преобразовано в строку и добавлено к сообщению
_MAPIMP void _MAPAPI mapWriteToDiagnosticsLog(const WCHAR * message, const WCHAR * messageex = 0, long int type = MT_ERROR); _MAPIMP void _MAPAPI mapWriteErrorToDiagnosticsLog(long int code, const WCHAR * message, long int type = MT_ERROR); _MAPIMP void _MAPAPI mapWriteToLogLastError(const WCHAR * message, const WCHAR * messageex, long int type = MT_ERROR, long int error = 0); _MAPIMP void _MAPAPI mapWriteToLogInt(const WCHAR * message, long int value, long int type = MT_INFO);
Спасибо. Не могу найти описание на структуру _MAPIMP в документации. Напишите пожалуйста (или в документацию ткните) спецификацию. Мне это нужно для того, чтобы корректно описанить лин на библиотеку.
Alexander Volovikov написал: Не могу найти описание на структуру _MAPIMP в документации. Напишите пожалуйста (или в документацию ткните) спецификацию.
Это макросы стандарта вызова, которые переопределяются в зависимости от системы и среды разработки. Определены они в mapsyst.h. Если коротко, то в Вашем случае будет так:
Иными словами, для C# _MAPIMP можно вообще убрать, а _MAPAPI определяет стандарт вызова, соответствующий стандарту WINAPI . WINAPI в системном WinDef.h для Windows объявлен так: #define WINAPI __stdcall для Linux могут быть вариации, для MacOS - это cdecl...
Денис Вицко написал: Значение кода можно посмотреть в maperr.rh или попробовать его расшифровать с помощью функции mapErrorMessageLog.
Подсказка: описание всех функций Вы найдете в заголовочных файлах в папке Include
Цитата
// Выдать сообщение об ошибке (на экран) // hwnd - идентификатор родительского окна для выдачи сообщения или 0 // code - код ошибки (см. MAPERR.RH) // filename - имя файла (объекта), для которого возникла ошибка // message - адрес строки для размещения текста сообщения (для записи // в протокол и т.п.), область памяти должна быть // не менее длины имени файла + 256 байт; значение может быть 0 // isshow - признак вывода сообщения на экран
_MAPIMP void _MAPAPI mapErrorMessageLog(HWND hwnd, long int code, const WCHAR * filename, WCHAR * message, long int size, long int isshow);
_MAPIMP void _MAPAPI mapErrorMessagePro(HWND hwnd, long int code, const WCHAR * filename, WCHAR * message, long int isshow);
_MAPIMP void _MAPAPI mapErrorMessageExUn(HWND hwnd, long int code, const WCHAR *filename, WCHAR *message);
Alexander Volovikov написал: публикую корректный вызов C# под Linux библиотеки
Спасибо. Ваш опыт будет полезен другим пользователям. Маршалинг должен обеспечить правильную передачу параметров в функцию. Я специалистом в C# не являюсь, но думаю, что было бы правильнее CharSet=CharSet.Unicode.