Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Замена гуидов


Автор: Argentum 19.5.2010, 15:06
Добрый день. возникла проблема. Когда-то был COM (c ActiveX) с использованием ATL, на основе него был сделан другой ком без замены гуидов. В итоге сейчас два кома конфликтуют, т.е. перекрывают друг-друга. Как я понимаю, нужно заменить гуиды. Подскажите какие именно и где их менять, какие есть особенности этой процедуры. И как я понимаю, два кома с одинаковыми именами существовать на одной машине могут, поэтому с именем самого кома ничего мудрить не нужно...
П.С. Просто я все позаменял, вроде регистрируется в системе, но он глючит даже при добавлении его на форму в VS 2008 (.net).

Автор: jonie 20.5.2010, 00:22
прочтите сначала матчасть в книге "Основы COM" Дейл Роджерсон автор, там думаю поймете где что менять, а мы врядли поймем, т.к. фраза "Когда-то был COM (c ActiveX) с использованием ATL" то примерно как "Я создал форму на C# с использованием WinAPI она работает а еще умеет программа читать файлы"... я к тому что ATL можно использовать и вне COM.... Либо постарайтесь более подробно описать структуру классов вашего проекта и структуру файлов, т.к. создать COM компонент можно разными "способами".

Автор: xvr 20.5.2010, 12:17
  • На той машине, где вас угораздило установить 2 COM'а с одинаковыми GUID'ами удалить ОБА COM'а (regsvr32 /s /u <filename.dll>) (Удалять ДО модификации GUID'ов!)
  • Во всех исходниках (включая *.reg) поменять ОДИНАКОВЫЕ GUID'ы на другие ОДИНАКОВЫЕ. Пересобрать все (Rebuild с нуля).
  • Заново зарегистрировать ОБА COM'а

Автор: Argentum 20.5.2010, 13:54
Цитата(jonie @ 20.5.2010,  00:22)
прочтите сначала матчасть в книге "Основы COM" Дейл Роджерсон автор, там думаю поймете где что менять, а мы врядли поймем, т.к. фраза "Когда-то был COM (c ActiveX) с использованием ATL" то примерно как "Я создал форму на C# с использованием WinAPI она работает а еще умеет программа читать файлы"... я к тому что ATL можно использовать и вне COM.... Либо постарайтесь более подробно описать структуру классов вашего проекта и структуру файлов, т.к. создать COM компонент можно разными "способами".


Что я не так сказал? ActiveX это по сути тот же COM , просто с некоторыми дополнениями и все. Не говорю, что я гуру, но представление имею достаточное. Проблема в том, что я не все тонкости COM ’а знаю. И заменив все гуиды, увидел, что все равно в дотнете один ком заменяется другим. Возможно нужно менять ProgID... Вот это я и спрашиваю... 
Цитата

я к тому что ATL можно использовать и вне COM

И? Если я пишу про COM!
Зачем лишние слова?
Цитата

т.к. создать COM компонент можно разными "способами"

Я вроде написал - ATL. Или что-то другое интересует?
Вы меня простите, но такое ощущение, что Вы просто хотите по фраериться.

А по топику. Могу чуть более разжевать:
Был COM (точнее это ActiveX), взяли исходники этого ActiveX ничего не меняли, кроме поведения функций (и может добавления пары функций и интерфейсов) и сделали еще один новый ActiveX. В итоге вышло два ActiveX, которые ведут себя по разному, но естественно на машине видны как один. Т.е. при регистрации этих ActiveX они заменяют друг-друга. Мой вопрос в том, что нужно поменять в одном из ActiveX’ов, чтобы в дотнете с помощью ToolBox (именно в нем, а не в ручную в с++ по гуиду) можно было добавить эти два ActiveX одновременно (почему я это уточняю? так как в VB была подобная проблема). 
При создании ActiveX использовался ATL.
Надеюсь теперь все понятно.

Автор: Argentum 20.5.2010, 14:46
Цитата(xvr @  20.5.2010,  12:17 Найти цитируемый пост)
На той машине, где вас угораздило установить 2 COM'а с одинаковыми GUID'ами удалить ОБА COM'а (regsvr32 /s /u <filename.dll>) (Удалять ДО модификации GUID'ов!)

Хм, я так не сделал. Чем это чревато? По идее же не чем серьезным, в основном только мусором в реестре? Или я чего-то не понимаю?

Автор: Argentum 20.5.2010, 17:41
Всем спасибо за внимание, на самом деле все оказалось проще. Есть макрос, который принимает набор констант и формирует из них гуид, который и является основополагающим. Т.е. именованно он и идентифицирует этот ActiveX в системе.

Автор: xvr 20.5.2010, 18:53
Цитата(Argentum @  20.5.2010,  14:46 Найти цитируемый пост)
Хм, я так не сделал. Чем это чревато? По идее же не чем серьезным, в основном только мусором в реестре?
Этот мусор может серьезно усложнить жизнь COM подсистеме. Если эти 2 COM'а регистрировали разный набор данных (например один регистрировал TLB, а второй нет), то оставшийся от первого COM'а мусор в реестре может подхватить 2й COM.
Поэтому лучше удалить оба, что бы гарантировать отсуствие мусора

Добавлено через 4 минуты и 25 секунд
Цитата(Argentum @  20.5.2010,  17:41 Найти цитируемый пост)
Есть макрос, который принимает набор констант и формирует из них гуид, который и является основополагающим. Т.е. именованно он и идентифицирует этот ActiveX в системе. 
Не только он. У компонента с TLB будет от 3 штук разных GUID'ов: по 1 штуке на каждый интерфейс, по 1 штуке на каждый CLSID, и 1 штука на TypeLib. Смотри в *.idl файле и в *.rgs файлах



Автор: Argentum 21.5.2010, 10:06
Цитата(xvr @ 20.5.2010,  18:53)
Цитата(Argentum @  20.5.2010,  14:46 Найти цитируемый пост)
Хм, я так не сделал. Чем это чревато? По идее же не чем серьезным, в основном только мусором в реестре?
Этот мусор может серьезно усложнить жизнь COM подсистеме. Если эти 2 COM'а регистрировали разный набор данных (например один регистрировал TLB, а второй нет), то оставшийся от первого COM'а мусор в реестре может подхватить 2й COM.
Поэтому лучше удалить оба, что бы гарантировать отсуствие мусора

Добавлено @ 18:57
Цитата(Argentum @  20.5.2010,  17:41 Найти цитируемый пост)
Есть макрос, который принимает набор констант и формирует из них гуид, который и является основополагающим. Т.е. именованно он и идентифицирует этот ActiveX в системе. 
Не только он. У компонента с TLB будет от 3 штук разных GUID'ов: по 1 штуке на каждый интерфейс, по 1 штуке на каждый CLSID, и 1 штука на TypeLib. Смотри в *.idl файле и в *.rgs файлах

Да, про *.idl файлы и *.rgs я знаю. Первым делом там и поменял.

Цитата

Этот мусор может серьезно усложнить жизнь COM подсистеме. Если эти 2 COM'а регистрировали разный набор данных (например один регистрировал TLB, а второй нет), то оставшийся от первого COM'а мусор в реестре может подхватить 2й COM.
Поэтому лучше удалить оба, что бы гарантировать отсуствие мусора

Ясно. Ну хоть что-то успокаивает, они оба регистрируют TLB ))

Автор: Argentum 21.5.2010, 11:49
Продолжение проблемы. Все регистрируется, система видит как два разных кома, но после того как я добавил этот активикс в ToolBox и пытаюсь перетащить на форму выскакивает: "Failed to import the ActiveX control. Please ensure it is properly registerd". 
Попробовал с помощью утилитки AxImp. Пишет: AxImp Error: Did not find a registered ActiveX control in 'E:\armgo\deps\TMReports\TMReports.ocx'., т.е. как я понял он не видит моего ActiveX. Т.е. я что-то не доделал или может, что-то лишнее задел. Может у кого есть идеи?

Автор: xvr 21.5.2010, 12:28
Цитата(Argentum @  21.5.2010,  11:49 Найти цитируемый пост)
Может у кого есть идеи? 
GUID'ы точно все поменял? Когда менял случайно не нагенерил разных GUID'ов там, где изначально они были одинаковыми?


Автор: Argentum 21.5.2010, 13:44
Цитата(xvr @  21.5.2010,  12:28 Найти цитируемый пост)
GUID'ы точно все поменял? Когда менял случайно не нагенерил разных GUID'ов там, где изначально они были одинаковыми?

По поводу второго вопроса, то вряд ли, так как я делал все через Replace All и менял по всему солюшену. А вот по поводу первого вопроса, мог пропустить еще какие-то макросы... попробую покопаться.

Автор: xvr 21.5.2010, 18:03
Цитата(Argentum @  21.5.2010,  11:49 Найти цитируемый пост)
пытаюсь перетащить на форму выскакивает: "Failed to import the ActiveX control. Please ensure it is properly registerd". 
Рискну предположить что не был зарегистрирован TypeLib (см в *.reg файлах параметр 'TypeLib')


Автор: Argentum 31.5.2010, 15:59
пишу с большой задержкой. Все уже давно решено. И действительно, проблемы была в том, что не был зарегистрирован TypeLib из-за того, что он был представлен макросом, который я упустил из виду при полной замене (Replace All). Т.е. просто этот макрос не подхавтило при замене.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)