Приложение, использующее Windows API commctrl.h, не работает на машинах без Platform SDK

StackOverflow https://stackoverflow.com/questions/155191

  •  03-07-2019
  •  | 
  •  

Вопрос

Я написал кое-что, что использует следующее::

#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.

KB94885

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top