Как создать Win32 DLL без MSVCR90D.dll?
Я пытаюсь воссоздать существующую C Win32 DLL с помощью одной простой функции. Мне удалось сделать это с помощью VS C++ 2008 Express, и моя новая DLL работает на моем компьютере с Vista и на компьютере с клиентом XP. Тем не менее, это не работает на других сайтах. Я проверил зависимости, и моя DLL требует MSVCR90D.dll и KERNEL32.dll, где оригинальная DLL требует только KERNEL32.dll.
Что такое MSVCR90D.dll и как мне создать простую Win32 DLL без этой зависимости?
5 ответов
Ссылка на статическую версию библиотеки времени выполнения C. Параметр находится в разделе "Генерация кода" в свойствах проекта. Тогда вам не нужно будет беспокоиться о библиотеках MSVCR*.
D в конце MSVCR90D.dll показывает, что вы скомпилировали свой.exe в режиме отладки. Вы должны распространять свое приложение только в режиме релиза.
Вы можете убедиться, что у них есть все необходимое, установив распространяемый пакет Microsoft Visual C++ 2008 x86 или x64. В противном случае вы можете просто скопировать нужные им файлы, найдя их на своем компьютере (сначала проверьте в%systemroot%\system32)
Пожалуйста, смотрите эту ссылку MSDN.
Буква "D" в названии означает "отладка". Это четкий индикатор отладочной сборки Visual Studio. Используйте сборку Release, и все будет хорошо.
Если целевая система еще не имеет среды выполнения C, вам, как правило, следует использовать официальный установщик для ее установки. Вот некоторые из версий среды выполнения, о которых вы можете узнать:
Вы также можете разработать полный установочный пакет, который включает в себя распространяемые библиотеки DLL (но не библиотеки отладки), необходимые для вашего приложения, и корректно обрабатывает установку параллельных сборок (SxS) в системный кэш сборок, используя метод, известный как модули слияния., Этот подход проще, если у вас установлена полная версия Visual Studio (не бесплатная версия VS Express), но итоговые установочные пакеты по-прежнему могут вообще не справляться с установкой среды выполнения на более старых (таких как Win 2K или 9x) платформах.
В статье MSDN " Перераспределение файлов Visual C++" описывается, каковы правила и как их легко соблюдать. Это обеспечивает отправную точку, чтобы узнать больше о многих проблемах, связанных с развертыванием.
Если исходная библиотека DLL, функциональность которой вы заменяете, не имела ссылки на MSVCR90.DLL, то она должна быть статически связана со средой выполнения. Возможно, вам следует проверить предположения предполагаемого приложения, которое будет вызывать вашу DLL. Смешивание библиотек времени выполнения C в одном процессе не всегда легко. Если хостинговое приложение уже использует MSVCR90.DLL, то вам тоже стоит это сделать. Однако это более серьезная проблема, чем вписывается в ответ на конкретный вопрос, поэтому я рекомендую вам исследовать ее и задавать новые вопросы по мере необходимости.
Другой подход, позволяющий избежать установки более поздних DLL-библиотек времени выполнения, заключается в создании ссылки на MSVCRT.DLL, которая распространяется с современными версиями Windows в качестве системного компонента. Это среда выполнения, которая была поставлена с Visual C 6.0, слегка обновлена для критических проблем и постоянно обновлялась, чтобы соответствовать ОС. Он вообще недоступен для 64-битных сборок, и довольно трудно обмануть Visual Studio, чтобы использовать его вместо более новой среды выполнения.
Проверьте, установлена ли на компьютере вашего клиента среда выполнения 2008 или нет. Если нет, вы можете либо установить его в своей системе, либо статически скомпилировать среду выполнения с вашим приложением.
Вероятно, вам нужно создать версию DLL вашей версии, протестировать ее и распространить вместо сборки Debug, которую вы распространяете сейчас.
Тем не менее, можно создать отладочную DLL, которая зависит от MSVCR90.DLL, не отладочной версии этой DLL. Для этого (VS 2008 SP1, инструкции аналогичны для других VS):
- Перейдите в Свойства проекта (щелкните правой кнопкой мыши проект на панели обозревателя решений, выберите "Свойства" в меню).
- Перейдите в Свойства конфигурации \C/C++\ Генерация кода.
- В Runtime Library вы, вероятно, выбрали "Многопоточную отладочную DLL". Измените это на "Многопоточная DLL".
Вам придется все перекомпилировать, но теперь вы должны связываться с не отладочными библиотеками VS.