Приложение, использующее Windows API commctrl.h, не работает на машинах без Platform SDK
Вопрос
Я написал кое-что, что использует следующее::
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <commctrl.h>
Этот код отлично работает на 2 машинах с установленным Platform SDK, но не запускается (ни в отладочных, ни в релизных версиях) при чистой установке Windows (виртуальных машин, конечно).Оно умирает вместе с вполне знакомым:
---------------------------
C:\Documents and Settings\Someone\Desktop\DesktopRearranger.exe
---------------------------
C:\Documents and Settings\Someone\Desktop\DesktopRearranger.exe
This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.
---------------------------
OK
---------------------------
Как я могу заставить его работать при чистых установках?Какую библиотеку DLL он использует, которую не может найти?Я ставлю на commctrl, но может ли кто-нибудь просветить меня, почему это не в каждой Windows?
Более того, если у кого-нибудь есть советы по отладке такой вещи, поскольку мой CPP, как кажется, уже заржавел :)
Редактировать - Что сработало для меня, так это загрузка распространяемого файла для Visual Studio 2008.Я не думаю, что это хорошее решение - загрузить файл размером 2 МБ и установить для запуска простого инструмента 11K.Я думаю, что изменю код, чтобы использовать LoadLibrary для получения 2 или 3 функций, которые мне нужны из comctl32.dll.Спасибо всем :)
Решение
Используйте средство обхода зависимостей.Скачивайте и устанавливайте с http://www.dependencywalker.com/ (просто распакуйте архив для установки).Затем загрузите свой исполняемый файл.Инструмент выделит, какая библиотека DLL отсутствует.Затем вы можете найти распространяемый пакет, который вам нужно отправить вместе с вашим исполняемым файлом.
Если вы используете VS2005, большинство случаев будет охвачено http://www.microsoft.com/downloads/details.aspx ?FamilyID=32BC1BEE-A3F9-4C13-9C99-220B62A191EEиdisplaylang=ru который включает в себя все необходимое для запуска EXES, созданных с помощью VS2005.Используя depends.exe, вы можете найти более легкое решение.
Другие советы
Общий контроль - это отвлекающий маневр.Ваша проблема в том, что среда выполнения Visual C ++ 8.0 - я предполагаю, что вы используете Visual Studio 2005 - не установлена.Либо статически ссылайтесь на библиотеку времени выполнения C / C ++, либо распространяйте библиотеку DLL времени выполнения.
У вас возникнет эта проблема с любой программой на C или C ++, использующей DLL.Вам это могло бы сойти с рук в версии 6.0 следующим образом msvcrt.dll
поставляется с операционной системой начиная с Windows 2000 и выше, а в VS.NET 2003 году как msvcr71.dll
поставляется с .NET Framework 1.1.Не более того.Visual Studio 2005 и более поздние версии используют параллельные сборки для предотвращения DLL-ада, но это означает, что вы не можете полагаться даже на .NET 2.0, устанавливающий точную версию C runtime, которую использует встроенный манифест вашей программы..NET 2.0-х годов mscorwks.dll
привязывается к версии 8.0.50608.0 в своем манифесте;приложение, сгенерированное VS, привязывается к 8.0.50727.762 начиная с версии VS2005 SP1.Насколько я помню, в оригинальной версии (RTM) VS2005 использовалась какая-то предварительная версия, что означало, что вам нужно было развернуть модуль слияния политики издателя, если вы использовали модули слияния, чтобы перенаправить привязку к фактической версии в выпущенном модуле слияния во время выполнения C.
Смотрите также Распространение файлов Visual C ++ в MSDN.
Я подозреваю, что он пытается найти версию common controls, которая не установлена.Возможно, вам понадобится файл манифеста для сопоставления версии общих элементов управления с вашей целевой операционной системой.Кроме того, возможно, вам потребуется убедиться, что у вас установлены те же среды выполнения VC, к которым вы были подключены.
Редактировать:Немного поискав, я подтвердил (в основном), что виновата версия вашей среды выполнения VC ++.Вам необходимо распространять версии, с помощью которых вы создавали.Platform SDK обычно включает в себя модуль слияния для этой цели, но часто для них также есть VCRedist.exe.Попробуйте посмотреть загрузки Microsoft.