Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Как запустить "ИнГео" как COM сервер

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
К. Кактамбаев



Зарегистрирован: 20.10.2009
Сообщения: 12
Откуда: Казань

СообщениеДобавлено: Вт 15 Июн 2010 02:14    Заголовок сообщения: Как запустить "ИнГео" как COM сервер Ответить с цитатой

Здравствуйте!
Подскажите, пожалуйста, существует ли возможность запуска "ИнГео" в виде COM объекта или OLE объекта?
Попытки запуска в виде COM объекта:
1) var aIngeo : IIngeoApplication;
aIngeo:=CreateComObject(CLASS_IngeoApplication) as IIngeoApplication;
2) var aIngeo : IIngeoApplication;
aIngeo:=CoIngeoApplication.Create;
не увенчались успехом.
Попытка запуска в виде OLE объекта:
var app : OleVariant;
app:=CreateOleObject('Ingeo.Application');
также не заработала.
Во всех случаях выдается ошибка "Класс не зарегистрирован". Повторная переустановка "ИнГео" не решила проблемы.
По моему мнению причина данных ошибок в отсутствии веток реестра
HKEY_CLASSES_ROOT\Ingeo.Application и HKEY_CLASSES_ROOT\CLSID\{04088492-0485-11D4-9719-000021C6D845}.
При установке они создаются.
Вариант с запуском InGeo.exe через CreateProcess, ShellExecute и их аналоги не устраивает, т.к. одновременно может быть запущено несколько экземпляров "ИнГео", подключенных к разным источникам (базам) данных или разным проектам. При запуске нового экземпляра ingeo.exe ф-ия GetActiveObject вернет первый попавшийся активный экземпляр "ИнГео" и не всегда нужный нам, т.к. активных экземпляров несколько.

В связи с этим возникает вопрос, как можно запустить "ИнГео" в качестве COM сервера.
Или есть иной способ получения нужного активного экземпляра "ИнГео" при наличии нескольких активных экземпляров "ИнГео".

Заранее благодарен за ответы.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Вт 15 Июн 2010 12:58    Заголовок сообщения: Ответить с цитатой

Можно использовать OCX компонент InGeoMapX.
Но это не совсем тоже самое, что InGeo.exe (больше предназначено для случаев, когда в своем приложении нужны функции ИнГео).

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
К. Кактамбаев



Зарегистрирован: 20.10.2009
Сообщения: 12
Откуда: Казань

СообщениеДобавлено: Вт 15 Июн 2010 19:02    Заголовок сообщения: Ответить с цитатой

Тогда я немного изменю вопрос и уточню для чего нужен запуск "ИнГео" и чем не устраивает MapX.
В разрабатываемом мной приложении используется ГИС "ИнГео" и в качестве одного из условий, предъявляемых к этому приложению является подключение к ГИС без ввода пароля и имени пользователя. Т.е. имя сервера, DBID, ProjectID, имя пользователя и пароль хранятся в зашифрованном виде и при запуске приложения расшифровываются и передаются в "ИнГео" или MapX. Хочу заметить, что такой небезопасный вход является одним из режимов работы. Другой режим требует ввода всех необходимых данных при каждом запуске приложения.
При вводе данных о ГИС, необходимо получить DBID и ProjectID. Пользователь не всегда имеет возможность (и желание) найти и ввести эти GUID. Для облегчения ввода этих "страшных" цифр предполагается выполянть открытие базы данных и проекта, а затем вычитывать и подставлять в поля нужные GUID. Т.е.
Код:
MainForm.Map1.ExecuteIngeoAction('ActionsFileOpenDb');
  if ((Assigned(MainForm.Map1.Ingeo.ActiveDb)) and
      (MainForm.Map1.Ingeo.ActiveDb.Areas.Count>0)) then
   begin
    Edit4.Text := MainForm.Map1.Ingeo.ActiveDb.Areas.Item[0].Projects.Item[0].ID;
    Edit5.Text := MainForm.Map1.Ingeo.ActiveDb.ID;
    u          := MainForm.Map1.Ingeo.ActiveDb.Users.UserFromID(MainForm.Map1.Ingeo.ActiveDb.LogonUserID);
    Edit6.Text := u.Name;
    MainForm.Map1.Ingeo.CloseActiveDb;
   end


Однако, такой код
Код:
MainForm.Map1.ExecuteIngeoAction('ActionsFileOpenDb');

в MapX выполнится по разному: Action будет работать хорошо на открытой базе, а на закрытой базе появится окно об отсутствии лицензии (так как MapX не видит сервер данных ИнГео и лицензионный ключ). Такие окна сильно смущают простого обывателя, поэтому такой способ не годится. Если есть способ выполнить Action "ActionsFileOpenDb" без вылета окна об отсутствии лицензии, то можно считать, что проблема решена.

Другой вариант: запустить свой экземпляр ИнГео, дождаться ввода имени пользователя и пароля, открытия проекта, затем вычитать эти данные и закрыть "ИнГео". Вариант не очень удобен, кроме того, надо уметь получать ссылку на запущенный тобой экземпляр ИнГео, а не на запущенный ранее или на MapX.

Победить MapX я не смог, поэтому решил использовать вариант с "ИнГео", но и тут я столкнулся с трудностями. Посоветуйте как лучше поступить.

С уважением, Канат Кактамбаев
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Ср 16 Июн 2010 08:32    Заголовок сообщения: Ответить с цитатой

1. Для того, чтобы открыть БД через MapX, не нужно делать MainForm.Map1.ExecuteIngeoAction('ActionsFileOpenDb').

Для этих целей у объекта MapX есть специализированные свойства:
Код:
MapX1.SpatialServer = "localhost"
MapX1.SpatialDbId = "{20635740-5705-11D2-8A07-0080C83F5845}"
MapX1.SpatialLogonName = "Администратор"
MapX1.SpatialLogonPassword = "1"

MapX1.DbActive = True


2. Если нужно, чтобы при запуске InGeo.exe автоматически открывалась нужная БД, в параметрах командной строки можно задавать идентификатор БД, имя и пароль пользователя.

Код:
Параметры командной строки:

 /ConfigFilePath:"Путь" - путь до конфигурационного файла, по умолчанию используется текущий каталог

 /Server:"Имя сервера" - по умолчанию используется локальный сервер данных

 /DBID:"Идентификатор базы данных"

 /User:"Имя пользователя" - по умолчанию "Администратор"

 /Password:"Пароль для доступа к БД"

 /OpenErrorOperation:[Close|OpenDialog|ShowError] - действие выполняемое при ошибке подключения к БД,

  по умолчанию Close (с возвратом кода ошибки = 1)


Список параметров командной строки можно получить, выполнив команду "InGeo.exe /?".

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
К. Кактамбаев



Зарегистрирован: 20.10.2009
Сообщения: 12
Откуда: Казань

СообщениеДобавлено: Сб 19 Июн 2010 16:47    Заголовок сообщения: Ответить с цитатой

Цитата:
1. Для того, чтобы открыть БД через MapX, не нужно делать MainForm.Map1.ExecuteIngeoAction('ActionsFileOpenDb').

Для этих целей у объекта MapX есть специализированные свойства:
Код:
MapX1.SpatialServer = "localhost"
MapX1.SpatialDbId = "{20635740-5705-11D2-8A07-0080C83F5845}"
MapX1.SpatialLogonName = "Администратор"
MapX1.SpatialLogonPassword = "1"

MapX1.DbActive = True


О наличии этих свойств я знаю и их использую. Дело в том, что при первом запуске приложения (или последующем без сохранения предыдущих данных) пользователь или администратор не знают GUID свойств DBID и ProjectID. Выполнив успешное подключение к базе и открывая нужный проект мы узнаем эти GUID.

Мне требуется при установке моего приложения на новом компьютере, уметь быстро определять нужные GUID. Это надо сделать максимально просто для пользователя, например выполнив тестовое подключение к базе. Если ошибок не возникло, значит полученные GUID верные и мы их сохраняем. Пользователя не стоит обременять поиском нужных GUID в индикаторе сервера данных и проводнике базы данных.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Iron_Man



Зарегистрирован: 02.09.2011
Сообщения: 20

СообщениеДобавлено: Чт 06 Окт 2011 12:32    Заголовок сообщения: Ответить с цитатой

Подскажите пожалуйста, как программно открыть проект?
P.S. Ответ нашёл в новой справке.
в версии Ингео, начиная с 4.4.0.42
Цитата:
Добавлены новые методы для интерфейса IIngeoApplication
метод OpenProject
метод CloseActiveProject

Что и требовалось по сути. Скачал, установил, использовал в коде - работает. Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
RuslanG



Зарегистрирован: 10.07.2005
Сообщения: 171
Откуда: ИНТЕГРО

СообщениеДобавлено: Пт 30 Мар 2012 15:07    Заголовок сообщения: Ответить с цитатой

К. Кактамбаев писал(а):
Мне требуется при установке моего приложения на новом компьютере, уметь быстро определять нужные GUID. Это надо сделать максимально просто для пользователя, например выполнив тестовое подключение к базе. Если ошибок не возникло, значит полученные GUID верные и мы их сохраняем. Пользователя не стоит обременять поиском нужных GUID в индикаторе сервера данных и проводнике базы данных.

Посмотрите пример для Visual Studio:
http://integro.ru/wiki/index.php?title=%D0%98%D0%BD%D0%93%D0%B5%D0%BE:MapX0001

Посмотрите пример для Delphi:
http://integro.ru/dl/ingeo/examples/IngeoMapExampleDelphi2.rar

_________________
С уважением, Руслан Гадеев
Видео уроки ИнГео
Документация ИнГео
Обновления ИнГео
Интегропедия
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Константин Г.



Зарегистрирован: 10.04.2012
Сообщения: 6
Откуда: Рязань

СообщениеДобавлено: Вт 10 Апр 2012 13:05    Заголовок сообщения: Не могу отключиться от Ингео Ответить с цитатой

Здравствуйте!

Я пытаюсь реализовать обмен данными между EasyTrace и Ингео. Доступен он как импорт/экспорт из EasyTrace. Пишу на Visual C++. По требованию пользователя выполняю подключение к Ингео, после обмена отключаюсь. Но при отключении приложение глухо зависает где-то в недрах IngeoMapX.ocx. Например :

//VERIFY( SUCCEEDED( CoInitialize(NULL) ));
VERIFY( SUCCEEDED( CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) ));
{
// подключаемся и сразу освобождаем ресурсы
IIngeoMapXControlPtr pAcApp;
pAcApp.CreateInstance ("IngeoMapX.IngeoMapXControl");
pAcApp = NULL;
}
// пытаемся отцепиться
CoUninitialize ();
CoFreeUnusedLibraries();

На CoFreeUnusedLibraries и происходит зависание. Версия используемой библиотеки IngeoMapX.ocx 4.4.0.242. Кто-то сталкивался с проблемой? Может есть какие-нибудь мысли решения ? Или что делаю не так?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Чт 12 Апр 2012 17:37    Заголовок сообщения: Ответить с цитатой

вроде все так. попробуйте на C# или паскале, тот же эффект?

вообще, при регистрации IngeoMapX.ocx вешает процесс regsrv32 - это известный баг, может это тот же эффект.

_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Константин Г.



Зарегистрирован: 10.04.2012
Сообщения: 6
Откуда: Рязань

СообщениеДобавлено: Пн 23 Апр 2012 11:19    Заголовок сообщения: Не могу отключиться от Ингео Ответить с цитатой

Попробовал на BDS 2006 - тот же эффект :
var
test : IUnknown;
//MapX : IIngeoMapXControl;
begin
CoInitialize(nil);

test := CreateCOMObject(CLASS_IngeoMapXControl);
// test.QueryInterface(IID_IIngeoMapXControl,MapX);
// MapX._Release;
// MapX := nil;
test._Release;
test := nil;
CoUninitialize;
CoFreeUnusedLibraries(); // зависаем
end;

Мне бы все это не сильно мешало (не отцепляется, ну и пусть себе висит), но по некоторым причинам обмен данными нужно производить в отдельном потоке, а, следовательно, каждый раз переподключаться к библиотеке, т.к. ThreadingModel у Ингео - Apartment.
Сейчас горожу костыли в виде прокси через еще один поток (подключенный к IngeoMapX, который не уничтожается). Очень бы хотелось услышать что-нибудь от разработчиков : имеет ли смысл надеяться на решение или же причесывать и отлаживать свой прокси?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Пн 23 Апр 2012 12:33    Заголовок сообщения: Ответить с цитатой

напишите в саппорт интегро, на форум они могут не заглянуть, а на мыло оперативно реагируют
_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Вт 24 Апр 2012 13:51    Заголовок сообщения: Re: Не могу отключиться от Ингео Ответить с цитатой

Константин Г. писал(а):
Попробовал на BDS 2006 - тот же эффект :
...
test._Release;
test := nil;
...

Повторный вызов _Release может привести к Access Violation.
Уберите его.

Я попробовал ваш пример на Delphi 2007.
Без изменений пример зависает.
После удаления вызова _Release все работает нормально.

Заметка по теме: в Delphi присваивание значения "nil" переменной типа IUnknown, IDispatch и прочим интерфейсам приводит к автоматическому вызову "_Release".

Что касается примера на C++, должно работать. Возможно приведен не весь код.

Попробуйте поменять местами CoFreeUnusedLibraries И CoUninitialize.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Константин Г.



Зарегистрирован: 10.04.2012
Сообщения: 6
Откуда: Рязань

СообщениеДобавлено: Вт 24 Апр 2012 14:47    Заголовок сообщения: Ответить с цитатой

Спасибо. Не подумал, что критичен повторный вызов _Release. Все же(после удаления повторного _Release) у меня так и не заработал данный пример. Пробовал на разных компьютерах с Win7 и WinXP. От места вызова CoFreeUnusedLibraries результат так же не зависит. Если в данном примере попытаться подключиться к Excel или AutoCad :
test := CreateCOMObject(CLASS_ExcelApplication);
test := CreateCOMObject(CLASS_AcadApplication);
Все зависания пропадают. Т.о. я не понимаю каким образом вам удалось заставить пример работать. Попробуйте пожалуйста в предложенном примере раскоментировать инициализацию MapX и попробовать поменять местами MapX := nil; и test := nil; (в реализиции visual c++ _com_ptr_t::CreateInstance объект ассоциированный с CLASS_IngeoMapXControl не храниться и разрушается сразу). Если у Вас действительно все работает, не могли бы передать построенный пример(с исходниками) мне. Наколько я понимаю мы используем одну и ту же версию IngeoMapX 4.4.0.242.

Ps что означает предположение "возможно приведен не весь код"? (полностью проект с кодом примера я отправлял в письме, могу продублировать)


Последний раз редактировалось: Константин Г. (Вт 24 Апр 2012 14:49), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Вт 24 Апр 2012 14:48    Заголовок сообщения: Ответить с цитатой

Похоже, проблема в модуле Gdi+.

Аналогичная проблема возникает не только у нас: http://mikevdm.com/BlogEntry/Key/GdiplusShutdown-Hangs-Mysteriously

Что-ж, будем править MapX для обхода данной проблемы.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Вт 24 Апр 2012 14:53    Заголовок сообщения: Ответить с цитатой

Константин, если не сложно, попробуйте в вашу тестовую программу в самое начало добавить это:

static GdiplusStartupInput gdiplusStartupInput;
static GdiplusStartupOutput gdiplusStartupOutput;

// Initialization
gdiplusStartupInput.SuppressBackgroundThread = TRUE;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput,
&gdiplusStartupOutput);

P.S. Как я понимаю, нужно заголовки и либы от gdiplus подключать.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Константин Г.



Зарегистрирован: 10.04.2012
Сообщения: 6
Откуда: Рязань

СообщениеДобавлено: Вт 24 Апр 2012 15:27    Заголовок сообщения: Ответить с цитатой

Первое ощущение - Работает! По тестирую еще на предмет реального отключение и попробую встроит в ЕТ. В любом случае спасибо за наводку, буду ждать IngeoMapX 243.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB