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

GTK Active C# при работе с функцией mapPortalMenu возникает ошибка

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 3 След.
RSS
GTK Active C# при работе с функцией mapPortalMenu возникает ошибка
 
Здравствуйте! Импортирую библиотеку gisu64wmsacces.dll, использую функцию mapPortalMenu для отображения списка геопорталов в виде дерева, получаю следующую ошибку (прикрепила фото). Пробовала дебажить как AnyCPU и как х86 приложение все равно ничего не выходит. Не могли бы подсказать в чем проблема?
ошибка.PNG (35.01 КБ)
 
У Вас программа компилируется под Any_CPU\x64\x86 ? Я думаю именно в этом проблема.
 
Спасибо, что подсказали, да я запуталась в разрядности, теперь компилирую все под х86 и использую библиотеку giswmsacces.dll, в итоге получаю ошибку "Не удается найти точку входа "mapPortalMenu" в DLL "giswmsacces". Также пробовала библиотеки wmsacces.dll и gisuwmsacces.dll везде выбивает эту же ошибку, подскажите пожалуйста,в чем может быть проблема?
 
Функция mapPortalMenu находится в gisuacces.dll.
 
Спасибо, Andrey Gheleznyakov, используя данную библиотеку, а также вызов ее в виде  [DllImport(@GisLibrary1, CharSet = CharSet.Ansi)] функция заработала. Только ее значение = 0 и диалог не показывает, как описано в руководстве программиста это значит что есть какая то ошибка, не подскажите как определить тип ошибки?
Как я поняла ошибка в этом :"Элемент управления верхнего уровня Windows Forms не может отображаться как элемент управления ActiveX." Подскажите пожалуйста,как ее можно исправить?
ошибка.PNG (18.3 КБ)
Изменено: Дарья Лунченко - 10.01.2016 01:42:12
 
Во-первых, не допускается смешение библиотек из разных наборов!
gisu*.dll - это библиотеки GIS ToolKit 12 x32
gisu64*.dll - это библиотека GIS ToolKit 12 x64
gis*.dll - это библиотеки GIS ToolKit 11 (gisacces.dll и пр.)

Если Вы используете GIS ToolKit Active, то он базируется на наборе библиотек GIS ToolKit 11 и позволяет создавать только x32 приложения.
Соответственно, вызов API из других библиотек (не GIS ToolKit 11) будет приводить к ошибке в лучшем случае, а как правило к Access Violation.

То есть вызов mapPortalMenu должен быть из gisacces.dll.


Во-вторых, для вызова mapPortalMenu необходимо заполнить структуру TASKPARMEX, где указывается HWND формы, вызывающей диалог, и HWND оконного элемента карты.

Вот пример из документации (не C#, правда):
Код
Пример использования функции mapPortalMenu, если идентификатор данных
HMAP равен 0:

 AnsiString IniName = "C:\\Panorama11\\panorama.ini";
 AnsiString HelpName = "C:\\Panorama11\\panorama.chm";
 TTASKPARMEX parm = {0};
 char wmsstring[4096] = {0};
 parm.Language = cML_RUSSIAN;
 parm.Handle = MapView1->Handle;
 parm.IniName = IniName.c_str();
 parm.HelpName = HelpName.c_str();
 parm.PathShell = AnsiString(ExtractFilePath(Application->ExeName)).c_str();
 parm.Handle = Application->Handle;
 parm.DocHandle = MapView1->Handle;
 SetMapAccessLanguage(cML_RUSSIAN);
 int left = Form1->Left;
 int top = Form1->Top;
 HMAP hm = 0;
 hm = mapPortalMenu(hm, &parm, left, top);
 if(hm == 0)
 return 0;
 int count = mapGetWMSCount(hm);
 MapView1->Rendering = false;
 for(int ii = 1; ii <= count; ii++)
 {
 char* name = mapGetWMSName(hm, ii);
 if(ii == 1)
 {
 int ret = MapView1->MapOpen(name, 1);
 if(ret == 0)
ShowMessage("Error");
 }
 else
 {
 MapView1->AppendData(name, 1);
 }
 }
 mapCloseData(hm);
 MapView1->Rendering = true;
 TDOUBLEPOINT point = {56./180.*M_PI,38./180.*M_PI};
 MapView1->SetCenter(point, PP_GEO);



Пример использования функции mapPortalMenu, если идентификатор данных
HMAP не равен 0:

 AnsiString IniName = "C:\\Panorama11\\panorama.ini";
 AnsiString HelpName = "C:\\Panorama11\\panorama.chm";
 TTASKPARMEX parm = {0};
 char wmsstring[4096] = {0};
 parm.Language = cML_RUSSIAN;
 parm.Handle = MapView1->Handle;
 parm.IniName = IniName.c_str();
 parm.HelpName = HelpName.c_str();
 parm.PathShell = AnsiString(ExtractFilePath(Application->ExeName)).c_str();
 parm.Handle = Application->Handle;
 parm.DocHandle = MapView1->Handle;
 SetMapAccessLanguage(cML_RUSSIAN);
 int left = Form1->Left;
 int top = Form1->Top;
 HMAP hm = MapView1->MapHandle;
 hm = mapPortalMenu(hm, &parm, left, top);
 MapView1->UpdatePictureBorder();
 TDOUBLEPOINT point = {56./180.*M_PI,38./180.*M_PI};
 MapView1->SetCenter(point, PP_GEO);
 MapView1->Repaint();
 
Спасибо большое за разьяснение, я как раз делаю по этому примеру, работаю с GIS ToolKit Active, теперь использую gisaccess.dll, и все равно получаю значение функциии = 0, вот прилагаю код: 1 картинка- задаю параметры, 2 - импортирую библиотеку и задаю начальные значения параметров. Выбивает ту же ошибку что я писала выше. Подскажите пожалуйста что не так?
код1.PNG (16.31 КБ)
код2.PNG (24.23 КБ)
 
Попробуйте указать полный путь к библиотеке gisacces, вместе с расширением файла.
 
Указала полный путь к библиотеке, ошибка осталась.
 
Здравствуйте!
Проверили вызов функции.
Пример кода
Код
...

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct TASKPARMEX              // Параметры вызова диалогов
    {
        public int Language;            // Код языка диалогов (1 - ENGLISH,
        // 2 - RUSSIAN, ...)
        public int Resource;            // Должен быть 0!
        public IntPtr HelpName;         // Полное имя файла ".hlp"
        public IntPtr IniName;          // Полное имя файла ".ini" приложения
        public IntPtr PathShell;        // Каталог приложения (exe,dll,...)
        public IntPtr ApplicationName;  // Имя приложения
        public int Handle;              // Идентификатор главного окна приложения
        public int DocHandle;
        public int StayOnTop; 

        public void Init()
        {
            Language = 1;
            Resource = 0;
            HelpName = IntPtr.Zero;
            IniName = IntPtr.Zero;
            PathShell = IntPtr.Zero;
            ApplicationName = IntPtr.Zero;
            Handle = 0;
        }
    }


      public class MapAccess
      {
         private const string GisLibrary = "gisacces";     // dll гис-ядра
        [DllImport(GisLibrary, CharSet = CharSet.Ansi)]
        public static extern int mapPortalMenu(int hmap, ref TASKPARMEX parm, int left, int top);
...


Вызов функции:
Код
...
        private void button1_Click(object sender, EventArgs e)
        {
            TASKPARMEX parm = new TASKPARMEX();
            parm.Init();
            MapControl.MapAccess.mapPortalMenu(mvMap.MapHandle, ref parm, button1.Top, button1.Left);
        }
...



Функция возвращает идентификатор открытых данных. Если никакие данные не открыты, то 0.
Изменено: Роман Твердов - 11.01.2016 16:09:31
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



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

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