Спасибо, это я понял.
Я не знаю как и что сделать чтобы подключить функцию поиска координат точки. ((
Я не знаю как и что сделать чтобы подключить функцию поиска координат точки. ((
04.09.2019 18:19:22
Спасибо, это я понял.
Я не знаю как и что сделать чтобы подключить функцию поиска координат точки. (( |
|
|
|
05.09.2019 06:33:33
Если Вас не затруднит помочь именно кодом на С#. Если я буду использоать директиву [DllImport], то это будет не контролируемый код, т.е. я не смогу отследить где ошибка. Заранее спасибо!! |
|||
|
|
05.09.2019 07:57:40
Я испробывал еще пару попыток. Результат на скринах.
Но происходит ошибка! |
|
|
|
05.09.2019 10:22:58
Судя по скриншоту ошибок сразу несколько. 1. HMAP, HSITE, HOBJ - это указатели. К int их преобразовать получиться только в 32-разрядных приложениях, в x64 будет Access Violation. 2. Нельзя использовать библиотеки из разных сборок. У Вас и gisaccess.dll (11 версия GTK) и gisuaccess.dll (12 версия GTK). 3. Неправильно записан путь к dll. Во-первых, символы слэша надо экранировать. Во-вторых, не стоит зашивать путь к dll жёстко в программе. Используйте просто имя DLL. Причём только тех DLL, которые использует OCX Вашего GTK Active. Для 12-ой версии это gisuaccess.dll (в случае x32-приложения) и gisu64access.dll (в случае x64-приложения). Если карта у Вам будет открыта одной библиотекой и полученный HMAP или HOBJ Вы будете пытаться передать в библиотеку из другой сборки ГИС-ядра, в лучшем случае ничего не произойдет, а вообще должна быть ошибка по памяти. Такой же результат может быть в случае если Вы будете загружать DLL по полному пути, а OCX библиотека GTK Active будет использовать DLL из другого места, так как загружает её без полного пути по правилам, определяемым операционной системой (пусть даже из той версии сборки ГИС-ядра). 4. Параметр distance - это double (8 байт), у Вас int (4 байта).
|
|||||
|
|
06.09.2019 07:28:53
Вчера попробывал еще прописать данную функцию следующим образом: [DllImport("gisacces.dll", EntryPoint = "mapSeekVirtualPointByDistanceInMap")] public static extern int mapSeekVirtualPointByDistanceInMap(int info, long number, double distance, TxDoublePoint point, long subject); На выполнение данной функции прописал так: int T = Program.mapSeekVirtualPointByDistanceInMap(MapObj.ObjHendle, 1, 100.0, new TxDoublePoint{X=start.x, Y=start.y}, 0); При выполнении данной функции возникает ошибка ("Разбалансировка стека"). |
|||
|
|
06.09.2019 07:41:46
Вам есть смысл посмотреть код приложения на C#, которое работает с ГИС-ядром. Там есть уже готовое описание разных функций и типов, в том числе и DOUBLEPOINT, и примеры их вызовов -
Например в вашем описании вы передаете структуру DOUBLEPOINT, а не адрес на нее! Пример из выше указанного приложения: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct DOUBLEPOINT // КООРДИНАТЫ ТОЧКИ { public double X; public double Y; public void Point(double x, double y) { X = x; Y = y; } } [DllImport(GisLibrary, CharSet = CharSet.Ansi)] public static extern void mapView(int hMap, int handle, int erase, ref DOUBLEPOINT point, int place); Не совсем понятно с какой версией библиотек вы работаете. В начале темы было указано что с 12-й, а вызов описываете указав 11-ю версии библиотеки. MapObj - это класс написан вами? |
||||
|
|
|||
© КБ Панорама, 1991-2024 Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности |