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

C#, Linux, открыть карту

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
C#, Linux, открыть карту
 
Добрый. В настоящий момент я изучаю возможности Git Toolkit. Я использую C# Net core 6. Подключил Gis библиотеки и пытаюсь открыть файл с картой (*.map) в среде Linux, Rider
Цитата
[DllImport(_library, CharSet = CharSet.Unicode)]
private static extern IntPtr mapOpenDataUn(string name, int mode);

var mapInPtr = mapOpenDataUn(fullName, 0);
if (mapInPtr.IsNull())
   throw new MapException($"Некорректный формат данных! Файл: {fullName}");
--> mapInPtr всегда 0x0



Возращается всегда пустой указатель. Лог записывается. В нем всего 2 строки.

Подскажите пожалуйста, как мне провести делальную диагностику причины возврата пустого указателя?
Карту проверил. Валидная. Данная ситуация при открытии любой карты.
Изменено: Денис Вицко - 03.06.2022 08:29:48 (исправил вставку картинок)
 
Лучше воспользоваться более универсальной функцией, которая сразу вернет код ошибки:
Цитата

 // Открыть данные с автоматическим определением их типа
 // (векторные,растровые,матричные...)
 // 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.
Если коротко, то в Вашем случае будет так:
Цитата
  #if defined(LINUXAPI)
    #define _DLLCLASS
    #define _MAPAPI   WINAPI
    #define _MAPIMP
  #else
    #define _DLLCLASS
    #define _MAPAPI   WINAPI
    #define _MAPIMP   __declspec(dllimport)
  #endif

Иными словами, для C# _MAPIMP  можно вообще убрать, а _MAPAPI определяет стандарт вызова, соответствующий стандарту WINAPI .
WINAPI в системном WinDef.h для Windows объявлен так:
#define WINAPI __stdcall
для Linux могут быть вариации, для MacOS - это cdecl...
 
Спасибо.
 
Добрый. А есть ли описания на указанную Вами функцию.? Что означает возвращаемый номер?
Получил номер 60007
Скрытый текст

Изменено: Денис Вицко - 03.06.2022 16:36:32 (исправил вставку картинок)
 
Цитата
Денис Вицко написал:
Значение кода можно посмотреть в 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);

Коды ошибок - тут (maperr.rh):
 
Спасибо. Я азобрался. Ну будущее, публикую корректный вызов C# под Linux библиотеки.
Код
// Получить описание ошибки
[DllImport(_library, CharSet = CharSet.Ansi)]
private static extern void  mapErrorMessageExUn(IntPtr hwnd, int code, [MarshalAs(UnmanagedType.LPWStr)] String name, 
    [MarshalAs(UnmanagedType.LPWStr)] out String message);
 
Цитата
Alexander Volovikov написал:
публикую корректный вызов C# под Linux библиотеки

Спасибо. Ваш опыт будет полезен другим пользователям.
Маршалинг должен обеспечить правильную передачу параметров в функцию.
Я специалистом в C# не являюсь, но думаю, что было бы правильнее CharSet=CharSet.Unicode.
 
Да, Спасибо. Так же , исправил.  
Страницы: 1
Читают тему (гостей: 1)



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

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