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

Проблема с закрытием диалога выбора семантики (selSemanticSelect)

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Проблема с закрытием диалога выбора семантики (selSemanticSelect)
 
Здравствуйте. Возникает ошибка при закрытии окна диалога выбора семантики selSemanticSelect.
Вот код вызова диалога

long int SemanticSelect(HRSC hrsc, TASKPARM* parm)
{
 long int ret=-1;
 HINSTANCE hLib = ::LoadLibrary("gisforms.dll");
 if(hLib){
   long int (*f)(HRSC,TASKPARM* );
   (FARPROC)f=GetProcAddress(hLib,"selSemanticSelect");
   if(f)ret=(*f)(hrsc,parm);
   ::FreeLibrary(hLib);
 }
 return ret;
}

а вот применение этой функции

void __fastcall TFormMain::bthChoiceSemanticClick(TObject *Sender)
{
 long int semcode;
 HRSC hrsc=func->GetRscIdent(hmap,hmap);
 TASKPARM p;
 memset(&p,0,sizeof(TASKPARM));
 p.Handle=Handle;
//  try{
   semcode=SemanticSelect(hrsc,&p);
//  }catch(...){;}
 if(semcode!=-1)edtSemanticCode->Text=IntToStr(semcode);
 else edtSemanticCode->Text="";
}

Приходится использовать SemanticSelect в защищенном блоке. Без try...catch вылезает ошибка Access Violetion ...
Объясните пожалуйста в чем может быть причина, может быть я неправильно TASKPARM p определяю?
 
А если так:

long int (WINAPI *f)(HRSC,TASKPARM* );

Многие забывают волшебное слово - WINAPI.
 
Действительно, забыл про WINAPI  :D . Заработало, спасибо
 
 Здравствуйте, подскажите пожалуйста вызываю данную функцию в прикладной задаче для ГИС Панорама 12, и получаю такую же ошибку: Access Violetion ... . Функцию вызываю из библиотеки MAPLIST64.DLL. Может надо из другой?
 
Цитата
Дарья Лунченко написал:
Здравствуйте, подскажите пожалуйста вызываю данную функцию в прикладной задаче для ГИС Панорама 12, и получаю такую же ошибку: Access Violetion ... . Функцию вызываю из библиотеки MAPLIST64.DLL. Может надо из другой?

Функция selSemanticSelectнаходится в библиотеке mapselec64.dll.
Вызвать функцию из библиотеки, в которой этой функции нет, нельзя. Поэтому непонятно, откуда берется AV.

Если вызов идет из правильной библиотеки, то для того, чтобы понять причину AV, надо больше информации: как описан прототип функции, библиотека линкуется статически или динамически, как получаются входные параметры, нет ли в них грязи?
В какой среде выполняется разработка?
 
"Вызвать функцию из библиотеки, в которой этой функции нет, нельзя. Поэтому непонятно, откуда берется AV. " . Это понятно, да у меня неправильно была указана библиотека, так как не смогла найти описания, где бы было написано какой h-файл соответствует какой библиотеке, при написании прикладных задач.
 
В архиве с библиотеками для GIS ToolKit 12  (gislib12x64.zip) есть файл readme.txt, в котором перечислены все библиотеки и их заголовочные файлы (*.h), в которых описаны функции MAPAPI-интерфейса.
 
Да, но функция selSemanticSelect описана в файле gisforms.h, в то время как в readme.txt написано : " gisu64selec.dll - содержит новую реализацию функций для вызова диалогов  поиска и выбора состава отображаемых объектов карты;  перечень функций в mapselec.h;". И в прикладных задачах используются вот эти библиотеки :

    #if defined(_M_X64) || defined(BUILD_DLL64)     // 02/12/14
   #define MAPACCLIB     "MAPACCES64.DLL"
   #define MAPRUSLIB     "MAPRUS64.DLL"
   #define MAPENGLLIB    "MAPENGL64.DLL"
   #define MAPENGLLIBX   "MAPENGL64.DLL"
   #define MAPUALIB      "MAPUA64.DLL"
   #define MAPFRLIB      "MAPFR64.DLL"
   #define MAPESLIB      "MAPES64.DLL"           // 16/09/15
   #define MAPOWLLIB     "MAPOWL64.DLL"
   #define MAPTASKLIB    "MAPTASK64.DLL"
   #define MTRLIB        "MAPMTREX64.DLL"
   #define MTLBUILD      "MTLBUILD64.DLL"
   #define MAPSELECLIB   "MAPSELEC64.DLL"
   #define MAPOBJLIB     "MAPOBJ64.DLL"
   #define MAPPICTRLIB   "MAPLIST64.DLL"
   #define MAPPASPLIB    "MAPPASP64.DLL"
   #define MAPSHP2MAPLIB "SHPTOMAP64.DLL"
   #define MAP2SHPLIB    "MAPTOSHP64.DLL"
и т.д......

Из названия которых не очень то понятно, где какую функцию искать?
 
Цитата
Дарья Лунченко написал:
Из названия которых не очень то понятно, где какую функцию искать?

Состав библиотек GIS Toolkit не совсем идентичен библиотекам ГИС Панорама 12.
В большинстве своем все описанные функции в заголовочных файлах находятся в соответствующих библиотеках в GIS Toolkit и в созвучных им библиотеках ГИС Панорама 12 (таким же образом и переопределяются константы). Но есть свои нюансы!
В GIS Toolkit, например, все диалоги собраны в библиотеках GISDLGS.DLL и GISFORMS.DLL (включая и selSemanticSelect).
Если Вы пишете прикладную задачу, лучше пользоваться примерами из SDK12.

Вот, например, как описан вызов selSemanticSelect в SDK12 в проекте Recode:
Код
//--------------------------------------------------------------
//  Выбрать код из диалога "Выбор кода семантики"
//--------------------------------------------------------------
int TRecForm::SelectCodeSemant()
{
 if(!Hmap || !tMap)   return 0;
 if(!Hrsc || !tRsc)   return 0;

 int codesem = 0;

 HMAP  map;

 if(sgSemant->Col == 0)
    map = Hmap;
 else
    map = tMap;

 HRSC hrsc = mapGetRscIdent(map, map);
 if(!hrsc)   return 0;

 // Загрузка библиотеки
 HINSTANCE libInst;

 // Вызов функции
 typedef long int (WINAPI * selsemantic)(HRSC,TASKPARM *);

 int  row = sgSemant->Row;

 selsemantic lpfn_selsemantic = (selsemantic)mapLoadLibrary(MAPSELECLIB,&libInst,"selSemanticSelect");
 if(lpfn_selsemantic)
  {
     HWND handle = TaskParm->Handle;
     TaskParm->Handle = Handle;

     TASKPARM  parm;
     memcpy(&parm, TaskParm, sizeof(TASKPARM));

     // Выбрать семантическую характеристику
     codesem = (*lpfn_selsemantic)(hrsc, &parm);

     TaskParm->Handle = handle;

     RSCSEMANTICEX  semtype;
     int column = 0;

     if(sgSemant->Col < 2)   column = 0;
     else  column = 2;

     while(1)
      {
        if(codesem)
         {
           if(!mapGetRscSemanticExByCode(hrsc, &semtype, codesem))  break;

           int line = sgSemant->Row;

           sgSemant->Cells[column][line] = codesem;
           sgSemant->Cells[column + 1][line] = (AnsiString)semtype.Name;
         }
        break;
       }
  }

 // Отключить библиотеку
 if(libInst)
 // Выгрузка библиотеки
 ::FreeLibrary(libInst);
 return codesem;
}
 
Ясно, спасибо.
Страницы: 1
Читают тему (гостей: 1)



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

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