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

не могу загрузить dll из gistool12free64

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

В составе gistool12free64, есть набор dll, например, Gisu64acces.dll, gisu64dlgs.dll, gisu64forms.dll и т.д. Так вот я хочу воспользоваться функцией  formSelectObject из gisu64forms.dll.
Так пытаюсь загрузить dll:
Код
HINSTANCE  libinst=::LoadLibrary(L"gisu64forms.dll"); //не находит, 
пытался и так:
Код
HINSTANCE  libinst;
long int   (WINAPI * formSelectObject)(HOBJ , MAPDFRAME* , long int , OBJECTFORM* , TASKPARM* );
formSelectObject = (long int (WINAPI *)(HOBJ , MAPDFRAME* , long int , OBJECTFORM* , TASKPARM* )) mapLoadLibrary("gisu64forms.dll" , &libinst, "formSelectObject");// все то же не находит
Проблемы с путями нет, так как загрузка gisu64dlgs.dll проходит нормально вот так:
Код
HINSTANCE libInst=::LoadLibrary(L"gisu64dlgs.dll");

А все dll лежат рядом. В чем может быть проблема?

P.S.: Также при загрузке gisu64forms.dll в QT через QLibrary выдает ошибку: "Cannot load library gisu64forms.dll: Произошел сбой в программе инициализации библиотеки динамической компоновки (DLL)."

Изменено: Евгений Соболев - 27.05.2019 12:58:22
 
Цитата
Евгений Соболев написал:
А все dll лежат рядом. В чем может быть проблема?

Есть подозрение, что проект у Вас 32-разрядный.
Приложение никогда не увидит библиотеку не свей разрядности.

Для работы в 32-разрядных приложениях необходимо использовать другой комплект библиотек ГИС-ядра (gisu*.dll - без 64 в имени).


Другой причиной невозможности загрузить библиотеку уз состава ГИС-ядра может быть отсутствие основной библиотеки - gisuacces.dll (gisu64acces.dll), так как они эту библиотеку линкуют статически.

В любом случае надо бы посмотреть GetLastError после LoadLibrary (если, конечно, LoadLibrary выполняется не в многопоточном режиме).
 
Здравствуйте!
Проект 64-разрядный. Библиотеки той же разрядности, только основная библиотека у меня называется Gisu64acces.dll.
Цитата
В любом случае надо бы посмотреть GetLastError после LoadLibrary (если, конечно, LoadLibrary выполняется не в многопоточном режиме).

GetLastError возвращает 0.
 
Цитата
Евгений Соболев написал:
только основная библиотека у меня называется Gisu64acces.dll.

Да, у меня в имени опечатка. Для x64 именно так она и должна называться.

При загрузке других библиотек ГИС-ядра, они автоматически грузят Gisu64acces.dll.
Если при этом проекте уже загружена эта DLL из другого места, может произойти сбой.

Проверьте, откуда у Вас загружены библиотеки (например, с помощью Process Explorer).

Попробуйте воспользоваться mapLoadLibrary вместо LoadLibrary, предварительно установив корректный путь в mapSetPathShellUn.

Если не поможет, просьба подготовить пример и прислать к нам на почту panorama@gisinfo.ru. Для чистоты эксперимента включите в него весь комплект библиотек, которые Вы используете. Посмотрим.
 
Цитата
Денис Вицко написал:
При загрузке других библиотек ГИС-ядра, они автоматически грузят Gisu64acces.dll. Если при этом проекте уже загружена эта DLL из другого места, может произойти сбой.
Gisu64acces.dll ведь всегда загружена без нее ничего работать не будет. От чего произойдет сбой? Например gisu64dlgs.dll грузится без проблем, хотя Dependency Walker говорит что она тоже зависит от Gisu64acces.dll.
Цитата
Денис Вицко написал:
Проверьте, откуда у Вас загружены библиотеки (например, с помощью  Process Explorer ).
Все грузится из тех путей, что я прописал, причем в Process Explorer видно, что при вызове функции mapLoadLibrary вначале gisu64forms.dll попадает в список dll приложения на несколько секунд, потом вываливается ошибка Library not found, и gisu64forms.dll пропадает из списка.
Цитата
Денис Вицко написал:
опробуйте воспользоваться  mapLoadLibrary  вместо LoadLibrary, предварительно установив корректный путь в  mapSetPathShellUn .
Не помогло, только я пользовался  mapSetPathShell
Цитата
Денис Вицко написал:
Если не поможет, просьба подготовить пример и прислать к нам на почту panorama@gisinfo.ru. Для чистоты эксперимента включите в него весь комплект библиотек, которые Вы используете. Посмотрим.
Написал на почту, в качестве основы взял mapview из примера и немного дополнил (подробности в письме)
 
Цитата
Евгений Соболев написал:
Так пытаюсь загрузить dll:
HINSTANCE  libinst=::LoadLibrary(L"gisu64forms.dll"); //не находит, пытался и так:

Исходя из Вашего первого сообщения я сделал вывод, что проблема на этапе загрузки библиотеки.
На самом деле библиотека у Вас загружается нормально.
Проблема в том, что вызывается несуществующая функция.

Именно поэтому
Цитата
Евгений Соболев написал:
при вызове функции  mapLoadLibrary  вначале gisu64forms.dll попадает в список dll приложения на несколько секунд, потом вываливается ошибка Library not found, и gisu64forms.dll пропадает из списка.

Мы проверили Ваш пример на Qt 5.12.3 + MinGW 7.3.0 x64 - все работает без проблем.

Функции formSelectObject в GIS ToolKit 12 нет.
Вместо нее следует использовать функцию rscShowStatisticObject из библиотеки gisu64rsctools.dll:
Код
// Открыть диалог "Выбор объекта"
//  hmap  - идентификатор открытых данных
//  parm  - параметры задачи
//  info  - идентификатор объекта карты
//  flag  - флаг режима работы диалога
//          0 - ввод семантики при создании или редактировании объекта (включена опция 
//              "Вся семантика", отключены кнопки "Выбрать", "Вперед" и "Назад");
//          1 - просмотр, редактирование и выбор объекта карты
// При ошибке возвращает 0

long int WINAPI _export rscShowStatisticObject(HMAP hmap, 
                                   TASKPARMEX * parm, HOBJ info, long int flag);


Это универсальный диалог, отображающий информацию как на конкретно выбранный объект, так и работающий со списком объектов. Но список надо держать вне этого диалога.
Для работы с этим диалогом требуется обработка следующих сообщений:
   AW_MOVEDOC        0x656  - переместить карту в заданную точку
   MT_MAPWINPORT    0x660 - обновить экран
   MS_CHECKOBJECT   0x686 - проверка доступности переходов от текущего объекта вперед и назад
   MS_NEXTOBJECT     0x67E - переход от текущего объекта вперед или назад
   MS_ACTIVEOBJECT  0x67F - выбор объекта
Пример реализации можно посмотреть в MDIALOG.PAS в методе TObjByListCommonDlg.Charts:
Скрытый текст


Таким образом, подготовку нужного Вам списка объектов, например в виде результата поиска объектов в точке, в заданной области или любым другим способом, Вы осуществляете самостоятельно с помощью контекста поиска - HSelect, берете первый объект из найденных, отдаете в диалог и взаимодействуете с ним далее посредством обработчиков сообщений.


Также пока оставлена функция formCheckAndSelectObject (в gisu64forms.dll):
Код
 // Выполнить поиск и обработку объекта карты в точке Position
 // с предварительной проверкой наличия объекта в точке Position
 // Выбранный объект доступен через переменную object
 // object - адрес для размещения описания объекта
 // place - применяемая система координат (геодезические
 // координаты не обрабатываются)
 // frame - прямоугольник поиска в соответствии с place,
 // причем центр прямоугольника обязан совпадать с точкой,
 // указанной в Position структуры OBJECTFORM
 // Структура TASKPARM описана в maptype.h
 // Если объект выбран - возвращается ненулевое значение
 // Если объект не выбран (нет в данной точке или пользователь
 // нажал "Cancel") - возвращается ноль

 long int WINAPI formCheckAndSelectObject(HOBJ object,
                                          MAPDFRAME* frame, long int place,
                                          OBJECTFORM* objform, TASKPARM* taskparm);


Библиотека gisu64forms.dll является устаревшей и оставлена пока для совместимости.
Вы можете использовать функции из нее, но я рекомендую сразу выполнить реализацию без ее использования.
 
Цитата
Денис Вицко написал:
Функции formSelectObject в GIS ToolKit 12 нет.
Но в mapcomponents она все ещё используется. Например если я хочу использовать класс QDMapSelObj, в функции выбора объекта в точке используется как раз formSelectObject. Как быть? Или вы именно по этой причине не стали экспортировать в dll ничего кроме qdmapview?

LoadLibrary у меня возвращает NULL. Отсутствие функции думаю не является причиной возврата NULL.
Изменено: Евгений Соболев - 29.05.2019 09:04:05
 
Здравствуйте!

Если не установлен запрет вывода диагностических сообщений (с помощью функции mapMessageEnable), то при неудачной попытке загрузить библиотеку на экран в отдельном окне выводится сообщение с причиной ошибки. Сообщения могут отличаться в плане того, не удалось найти саму библиотеку или только функцию из ее состава. Уточните, пожалуйста, что выводится на экран в Вашем случае?
 
Цитата
Александр Савелов написал:
Здравствуйте!

Если не установлен запрет вывода диагностических сообщений (с помощью функции mapMessageEnable), то при неудачной попытке загрузить библиотеку на экран в отдельном окне выводится сообщение с причиной ошибки. Сообщения могут отличаться в плане того, не удалось найти саму библиотеку или только функцию из ее состава. Уточните, пожалуйста, что выводится на экран в Вашем случае?
Это mapLoadLibrary выводит сообщение, а не LoadLibrry, например такой код, где запрашиваю точно имеющеюся функцию formCheckAndSelectObject :
Код
HINSTANCE  libinst;    long int   (WINAPI * formSelectObject)(HOBJ , MAPDFRAME* , long int ,
                                           OBJECTFORM* , TASKPARM* );
    formSelectObject = (long int (WINAPI *)(HOBJ , MAPDFRAME* , long int ,
                                            OBJECTFORM* , TASKPARM* ))
           mapLoadLibrary("gisu64forms.dll" , &libinst, "formCheckAndSelectObject");
Выдает сообщение: Library not found - gisu64forms.dll

Такой код:
Код
HINSTANCE  libinst=LoadLibrary(L"gisu64forms.dll");    
if (!libinst)
    {
        qDebug()<<"library not load";
    }
Очевидно печатает в консоль: "library not load";

Такой код с использованием QLibrary:
Код
QLibrary myLib("gisu64forms.dll");
if( !myLib.load () )
{
     qDebug() << "Loading failed!";
}
qDebug()<<myLib.errorString();
Выводит в консоль:
Loading failed!
"Cannot load library gisu64forms.dll: Произошел сбой в программе инициализации библиотеки динамической компоновки (DLL)."
 
Цитата
Евгений Соболев написал:
Вместо нее следует использовать функцию rscShowStatisticObject из библиотеки gisu64rsctools.dll:
Денис, ну вот я последовал вашему совету, стал использовать функцию rscShowStatisticObjec, окошко открывается, все хорошо. Но там есть кнопочки которые хочется потыкать, например Редактор Классификатора, но где-то в глубине все равно дергается библиотека GISU64FORMS  и вылетает ошибка, что она не найдена(см рисунок). У вас имеется решение этой проблемы?
Снимок.PNG (313.32 КБ)
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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