Наследование от ICommand

0 голосов
спросил 17 Ноя, 06 от Scok (1,260 баллов) в категории Программные продукты Esri
   Доброе время суток!

Я пишу COM-объекты без использования ATL, описывая и контролируя почти все аспекты жизни COM-объекта самостоятельно. Возникла необходимость "вылезть" с кнопочкой на панель инструментов ArcMAP. Унаследовал ко-класс своего интерфейса от ICommand из SystemUI, определил все его методы (ICommand оказался абстрактным image) и успешно откомпилировался. Однако, при добавлении в ArcMAP команды из файла получаю сообщение "Не удается загрузить библиотеку из указанного файла". Пример с IZoom, написанный на ATL разобрал и "интересных" различий со своим проектом не вижу. Вот такая проблема. Какие могут быть предположения? Может там DLLMAIN какой-то особенный?

5 Ответы

0 голосов
ответил 20 Ноя, 06 от sschainik (4,900 баллов)
есть примеры в хэлпе и кроме того в C:\ProgramFiles\ArcGIS\DeveloperKit\samples
 
например линейка (vb6) - C:\ProgramFiles\ArcGIS\DeveloperKit\samples\Map_Analysis\Tools\Measure_Tool\Visual_Basic
 
сложнее если делаете идентификатор объектов, я как то сделал но не до конца, времени нет с классами связей разобраться
0 голосов
ответил 23 Ноя, 06 от cron314 (860 баллов)
А в dll присутствует функция саморегистрации DllRegisterServer?
0 голосов
ответил 23 Ноя, 06 от Scok (1,260 баллов)
cron314
Не, нет такой. Регистрация в реестре выполняется отдельной софтиной: менеджером регистраций, которая помимо регистрации еще и дополнительную информацию о компонентах предоставляет.
В менеджере регистраций я прописываю пути в ветке HKCR\CLSID - UUID ко-класса, HKCR - Lib.CoClass и HLCR\TypeLib - UUID библиотеки типов.
0 голосов
ответил 02 Дек, 06 от Scok (1,260 баллов)
А теперь у меня обновленный вопрос: если писать .Net-приложение, но "заворачивать" его в COM-объект (пример: ArcGIS Developer Help/Developer Environments/.Net/Walkthroughs/C#/Creating a simple command for ArcMap) и все это хозяйство наследовать от ICommand, то как в примере - все великолепно. НО, надо на С++. После вдумчивого повторения указанного примера в Visual Studio .Net 2003 утилита RegAsm не видит типов для экспорта. Причем, ключевое отличие проекта на C++ от проекта на CSharp в наличии в последнем опции COM Interop = true. Вопрос по Чернышевскому: Что ДЕЛАТЬ!? Совсем в тупик зашел.
0 голосов
ответил 02 Дек, 06 от Scok (1,260 баллов)
Все, решилась проблема. RegAsm - это хорошо, но и GacUtil забывать не стоит. Действительно, RegAsm не находит интерфейса для регистрации, но библиотеку типов она регистрирует. А она (библиотека типов) ссылается на GAC. Поэтому после помещения dll-ки в GAC появилась долгожданная  запись категории и самой кнопки в меню добавления команд в ArcMAP.
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...