Я занимаюсь разработкой 64-битного COM-сервера VC ++ ATL внутри процесса, который в основном просто перенаправляет все вызовы на COM-сервер вне процесса. Так что мой COM-сервер в принципе ничего не делает.
Первоначально он использовал среду выполнения C ++ в DLL (/MD
переключатель компилятора). Я заметил, что при развертывании на чистой 64-битной Win2k3 regsvr32 происходит сбой с ошибкой: Ошибка LoadLibrary ({fileName}) - это приложение не удалось запустить из-за неправильной конфигурации приложения. Переустановка приложения может решить эту проблему.
Google помогает - проблема в том, что VC ++ 9 runtime не установлен. Проблема сохраняется, даже если msvcr90.dll находится в том же каталоге, что и мой COM-сервер. Это, как я полагаю, связано с тем, как работает поиск зависимых библиотек - он не смотрит в один и тот же каталог, и мне нужен msvcr90.dll в Windows \ System32 или подобном. Поскольку это усложняет мое развертывание, я переключился на использование статически связанной среды выполнения C ++ (ключ компилятора / MT). Теперь это разворачивается нормально. Размер файла .dll составляет всего 110 КБ (было 45 КБ), поэтому меня это не беспокоит.
Теперь я много слышал о том, как плохо смешивать разные версии среды выполнения C ++ в одном процессе - состояние CRT может быть нарушено, ад может разорваться и так далее. Должен ли я думать об этом и ожидать проблем с изменением / MD на / MT, тем более что я не знаю, какую версию используют пользователи COM-сервера?