Какую версию VC ++ я выбираю - статическую или динамическую? - PullRequest
3 голосов
/ 10 ноября 2009

Я занимаюсь разработкой 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-сервера?

Ответы [ 2 ]

2 голосов
/ 10 ноября 2009

Насколько я знаю, статическая среда выполнения устарела в VS с VS2005.

Проблема в том, что Visual C Runtime находится рядом друг с другом. То есть он должен быть загружен из каталога c:\windows\winsxs. Вот почему размещение его в том же каталоге больше не работает.

Правильным решением является установка правильного распространяемого CRT в клиентской системе.

См. http://msdn.microsoft.com/en-us/library/ms235316.aspx для получения дополнительной информации

Это может быть правильным распространяемым: http://www.microsoft.com/downloads/details.aspx?familyid=BD2A6171-E2D6-4230-B809-9A8D7548C1B6&displaylang=en

Установка правильного установит dll среды выполнения в каталог winsxs.

1 голос
/ 10 ноября 2009

Это не должно быть проблемой.

Статическое связывание в основном берет необходимые функции из библиотеки и помещает их в код вашей DLL (таким образом, увеличивается в размере). Затем он должен работать точно так же, как если бы вы сами написали эти функции в своем коде.

...