979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Создание COM DLL: ошибка в приведении типов10.07.2015, 18:46. Показов 1738. Ответов 6
Метки нет (Все метки)
Здорова!
Читаю про COM, в книге нашел пример Пример EX24B - обычная MFC DLL, содержащая настоящую COM-версию класса CSpaceship. Вот код Файл INTERFACE.h: Кликните здесь для просмотра всего текста
Файл SPACESHIP.h Кликните здесь для просмотра всего текста
Файл SPACESHIP.cpp Кликните здесь для просмотра всего текста
И когда компилирую получаю ошибки: Кликните здесь для просмотра всего текста
SPACESHIP.cpp 1>d:\visual studio 2010\projects\mfcdllcom\mfcdllcom\spaceship.cpp(80): error C2664: CCmdTarget::ExternalQueryInterface: невозможно преобразовать параметр 1 из "const IID" в "const void *" 1> Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен 1>d:\visual studio 2010\projects\mfcdllcom\mfcdllcom\spaceship.cpp(119): error C2664: CCmdTarget::ExternalQueryInterface: невозможно преобразовать параметр 1 из "const IID" в "const void *" 1> Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен 1>d:\visual studio 2010\projects\mfcdllcom\mfcdllcom\spaceship.cpp(136): error C2440: приведение типов: невозможно преобразовать "CString" в "const char *" 1> Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен 1> 1>СБОЙ построения. Как можно перевести const IID в const void* ??? Ошибка в этом коде:
Добавлено через 4 часа 42 минуты Ну так что? Кто этот пример разбирал? В книге там этот пример для VS6, а я набрал его в VS10, мб. из за этого ошибки вылазят?
0
|
10.07.2015, 18:46 | |
Ответы с готовыми решениями:
6
Ошибка в приведении типов О приведении типов и классов Ну жна помощь в приведении типов FormatException не обработано при приведении типов |
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|||||||||||
13.07.2015, 20:27 [ТС] | 2 | ||||||||||
В общем исправил эту ошибку, там нужно указатель передавать отак:
1>ClCompile: 1> Для всех выходных данных обновления не требуется. 1> SPACESHIP.cpp 1>d:\visual studio 2010\projects\mfcdllcom\mfcdllcom\spaceship.cpp(136): error C2440: приведение типов: невозможно преобразовать "CString" в "const char *" 1> Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен 1> 1>СБОЙ построения. ошибка в этой функции:
Как эту ошибку обойти? Я пока закоментировал строку с ошибкой и так скомпелировал и получил COM DLL, а теперь что с этим COM DLL делать? Добавлено через 1 минуту Создал объект DLL COM теперь нужно его как то попытаться использовать но как? )))) Добавлено через 41 минуту Я создал тестовый пример и сейчас у меня пишет ошибки: Не найден Program ID -- ошибка = 800401f3 То есть он не может найти в реестре найти GUID моей COM DLL, как добавить в реестр свою COM??? Добавлено через 6 минут Как добавить в реестр информацию о MFC COM DLL? Добавлено через 20 минут Так что никто не знает как его зарегистрировать? Я добавил dll в windows/system32 и вызвал из меню пуск -> выполнить regsvr32 MfcDllCom.dll , и у меня выводится ошибка: Добавлено через 1 минуту в книге написано что для того чтобы зарегистрировать dll нужно использовать использовать специальную утилиту с диска под названием REGCOMP где ее брать хз.
0
|
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
|
|
13.07.2015, 20:50 | 3 |
Зачем тебе com? Брось каку.
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
14.07.2015, 08:57 [ТС] | 4 |
ЧЕ?
Добавлено через 3 минуты Нашел утилиту RegComp и все рамно она не регистрирует, пишет ошибку: failed to find dllregisterserver function что делать? что это означает? Добавлено через 9 минут Ну так что это значает, не может найти dllRegisterServer, а что это такое? Добавлено через 10 часов 0 минут так что никто не знает как зарегистрировать COM компонент? Добавлено через 30 минут и что делать? как исправлять? Добавлено через 37 секунд Я смотрел что эта ошибка означает, это типо у меня неправильный dll. А что делать? как его исправлять?
0
|
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
|
|
14.07.2015, 10:05 | 5 |
Ну а почитать внимательно про процесс создания com-объектов кто будет? Надо не только написать класс. Но и описать интерфейс, сгенерировать прослойку и откомпилить уже все вместе. Ты для начала подбери побольше литературы и найди простой пример.
З.Ы.: если ты сейчас не знаешь зачем тебе com объекты и с чем их едят. Начни с чего-то более простого. Прочитай про REST, ZeroMQ и Т.п.
0
|
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
|
|
14.07.2015, 10:16 [ТС] | 6 |
Ачто это такое? Мне нужно COM и ActiveX разобрать, я хочу в своих программах использовать уже готовые программы и не заморачиватся.
Кстати только что "методом тыка" заработало, зарегистрировал dll и все заработало, проблема была в самой dll, там ее нужно создавать как dll, а я как попало создал Хороше бы еще рассмотреть пример с COM EXE, с dll разобрались, а как создать теперь COM exe - так называемый внешний компонент. dll это как бы внутренний компонент, а exe внешний. Да тут еще где на диске должны хранится COM компоненты? От например COM DLL как я понял ее как обычную dll в папке с программой не получится сохранять, ее же ведь нужно регистрировать? Значит что получается ее нужно в windows/system32 закидывать, регистрировать и потом использовать? Вообще то я не пробовал ее запустить из папки программы, но что то мне кажется что из папки программы оно не будет работать, от если я удалю зарегистрированую COM dll из system32 и скопирую ее в папку с программой, то она ж не найдется правильно? Щас проверю Добавлено через 57 секунд Я не хочу в этой ветке создавать, там людей мало, само больше в С++ для начинающих. Там создай и будешь ждать год пока кто то ответит Добавлено через 8 минут Только проверил, удаляю из syste32 и добавляю в папку с программой и не работает, что так оно и должно быть, а почему dll работают? Получается нужно повторно регистрировать dll уже из папки с программой тогда работает.
0
|
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
|
|
14.07.2015, 10:51 | 7 |
потому что DLL грузит система: при загрузке EXE система находит в нем информацию о том какие DLL и какие функции он использует и загружает эти DLL / получает точки входа в функции (если загрузка не производится "руками" и указано только имя DLL, то в начале поиск DLL идет в папке с EXE затем в системной папке - почему? - так сделали).
DLL в котором живет COM-объект так же загружает система. но причина этой загрузки не запуск EXE, а создание объекта - кто-то где-то в системе создает объект определенного класса, система ищет в реестре запись в которой написано где лежит DLL в котором живет этот объект (запись создается при регистрации), загружает ее и получает от нее ссылку на объект. если вы утащили DLL, то система конечно же не найдет ее. напрасно вы игнорируете ветку форума посвященную COM - да, в ветке для начинающих больше людей, но и вопрос ваш утонет в потоке проблем-однодневок. больные вашей проблемой люди заходят в соответствующую ветку, а другие вам вряд ли ответят. пример COM (без обложек) https://www.cyberforum.ru/com-... ost3538077
1
|
14.07.2015, 10:51 | |
14.07.2015, 10:51 | |
Помогаю со студенческими работами здесь
7
Изменение значения при приведении типов Нахождение ошибки в наследовании и приведении типов Почему выдает ошибку о приведении типов? Куда деваются байты при приведении типов? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |