Проблема с регистрацией dll
Модераторы: Duncon, Hawk, Romeo, Eugie
Здравствуйте, уважаемые форумчане!
Недавно начал работать с MSVS2008 и столкнулся со следующей проблемой:
Написал расширение оболочки по статье http://www.rsdn.ru/article/winshell/shlext1.xml
(т.е. имеет место ATL COM проект на выходе которого dll). Отладил, откомпилировал на своей машине под Windows 7 x64. Все работает, все ок. Пытаюсь зарегистрировать данную dll на машине пользователя, на этапе регистрации получаю ошибку "Не удалось загрузить модуль my.dll ..." Возможно ошибка в разных версиях msvcr80.dll. Библиотека .NET Framework у пользователя установлена. Подозреваю, что нужно что-то изменить в настройках проекта перед компиляцией, что-то в сторону Runtime Libray = Multi-threaded (/MT). Но все равно ругается. Подскажите, пожалуйста по пунктам, какие настройки были выставлены, чтобы все необходимые dll были при компиляции подключены в мою my.dll. Спасибо.
Недавно начал работать с MSVS2008 и столкнулся со следующей проблемой:
Написал расширение оболочки по статье http://www.rsdn.ru/article/winshell/shlext1.xml
(т.е. имеет место ATL COM проект на выходе которого dll). Отладил, откомпилировал на своей машине под Windows 7 x64. Все работает, все ок. Пытаюсь зарегистрировать данную dll на машине пользователя, на этапе регистрации получаю ошибку "Не удалось загрузить модуль my.dll ..." Возможно ошибка в разных версиях msvcr80.dll. Библиотека .NET Framework у пользователя установлена. Подозреваю, что нужно что-то изменить в настройках проекта перед компиляцией, что-то в сторону Runtime Libray = Multi-threaded (/MT). Но все равно ругается. Подскажите, пожалуйста по пунктам, какие настройки были выставлены, чтобы все необходимые dll были при компиляции подключены в мою my.dll. Спасибо.
В лес .NET пиши на API везде будет работать..
А вообще может не работать из-за того что на 64 битной откомпелированно (числа больше) 32 под 64 работать должны а вот в обратную сторону врядле.
А вообще может не работать из-за того что на 64 битной откомпелированно (числа больше) 32 под 64 работать должны а вот в обратную сторону врядле.
[syntax=Delphi] [/syntax]
В том-то и дело, что dll написана на C++, возможно где-то зацепил какой-то класс MFC, но в дотнет не лез. Компилировал и под 64 и под 32 разрядную систему. Эффекта ноль. Кроме того тесты велись на 64х разрядной машине, также как и разработка.Duncon писал(а):В лес .NET пиши на API везде будет работать..
А вообще может не работать из-за того что на 64 битной откомпелированно (числа больше) 32 под 64 работать должны а вот в обратную сторону врядле.
Значит ошибка в коде, С++ не API
[syntax=Delphi] [/syntax]
К сожалению, вы не привели текст ошибки полностью, но похоже, проблема с зависимостями. В прежних версиях MSVS был замечательный инструмент Dependency Walker (depends.exe); в поставку 2008 он не включен, но можно его свободно скачать с сайта http://www.dependencywalker.com/
2 Duncon: Но ведь на машине где велась разработка dll регистрация проходит без ошибок, причем и 32х и 64х.
2 Eugie: Спасибо за совет, вначале выясню зависимости, попытаюсь просто перекинуть эти библиотеки на тестовую машину, если все получится, буду думать как все это вместе объединить.
2 Eugie: Спасибо за совет, вначале выясню зависимости, попытаюсь просто перекинуть эти библиотеки на тестовую машину, если все получится, буду думать как все это вместе объединить.
Регистрация прошла успешно после установки на клиентской машине пакета Microsoft Visual C++ 2008 Redistributable Package. Как можно сделать чтобы не таскать этот пакет с длл а все необходимое засунуть в длл при компиляции?
Используйте статическое связывание. Следующие опции должны быть включены:
- Use MFC in a Static Library
- Static Link to ATL
- Runtime Library: Multi-threaded (/MT)
Обзорная статья в MSDN: http://msdn.microsoft.com/en-us/library/zebw5zk9.aspx
- Use MFC in a Static Library
- Static Link to ATL
- Runtime Library: Multi-threaded (/MT)
Обзорная статья в MSDN: http://msdn.microsoft.com/en-us/library/zebw5zk9.aspx
Eugie, большое спасибо за подробный ответ. Буду пробовать.