Windows API commctrl.h с помощью приложения не работает на компьютерах без Platform SDK - PullRequest
2 голосов
/ 01 октября 2008

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

#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, но может ли кто-нибудь объяснить мне, почему это не с каждым окном?

Дальше, если у кого-то есть советы, как отлаживать такую ​​вещь, так как мой CPP уже ржавый, как кажется:)

Редактировать. Для меня работало скачивание Распространяемого пакета для Visual Studio 2008. Я не думаю, что это хорошее решение - загрузка файла размером 2 МБ и установка для запуска простого инструмента размером 11 КБ. Я думаю, что я изменю код, чтобы использовать LoadLibrary, чтобы получить 2 или 3 функции, которые мне нужны от comctl32.dll. Спасибо всем:)

Ответы [ 3 ]

5 голосов
/ 01 октября 2008

Используйте Dependency Walker. Загрузите и установите с http://www.dependencywalker.com/ (просто распакуйте для установки). Затем загрузите свой исполняемый файл. Инструмент выделит, какая DLL отсутствует. Затем вы можете найти распространяемый пакет, который вам нужно будет доставить вместе с вашим исполняемым файлом.

Если вы используете VS2005, большинство случаев будет покрываться http://www.microsoft.com/downloads/details.aspx?FamilyId=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&displaylang=en, который включает в себя все необходимое для запуска EXE-файлов, созданных с VS2005. Однако, с помощью зависимости.exe вы можете найти более легкое решение.

1 голос
/ 01 октября 2008

Общий контроль - красная сельдь . Ваша проблема в том, что среда выполнения Visual C ++ 8.0 - я предполагаю, что вы используете Visual Studio 2005 - не установлена. Либо статически связывайте библиотеку времени выполнения C / C ++, либо распространяйте библиотеку времени выполнения.

Эта проблема возникнет у любой программы на C или C ++, использующей DLL. Вы могли обойтись без этого в VS 6.0, так как msvcrt.dll поставлялся с ОС от Windows 2000 и выше, а в VS.NET 2003 как msvcr71.dll шел с .NET Framework 1.1. Больше не надо. Visual Studio 2005 и более поздние версии используют параллельные сборки для предотвращения DLL Hell, но это означает, что вы не можете полагаться даже на .NET 2.0, устанавливающую точную версию среды выполнения C, которую использует встроенный манифест вашей программы. .NET 2.0 mscorwks.dll связывается с версией 8.0.50608.0 в своем манифесте; приложение, созданное VS, связывается с 8.0.50727.762 с VS2005 SP1. Насколько я помню, он использовал некоторую предварительную версию в первоначальном (RTM) выпуске VS2005, что означало, что вам пришлось развернуть модуль слияния политики издателя, если вы использовали модули слияния, чтобы перенаправить привязку к версии, фактически находящейся в выпущенном выпуске. Модуль слияния времени выполнения C.

См. Также Перераспределение файлов Visual C ++ в MSDN.

0 голосов
/ 01 октября 2008

Я подозреваю, что он пытается найти версию общих элементов управления, которая не установлена. Вам может понадобиться файл манифеста для сопоставления версии общих элементов управления с целевой операционной системой. Кроме того, вам может потребоваться убедиться, что вы установили те же среды выполнения VC, к которым были подключены.

Блог Криса Джексона

РЕДАКТИРОВАТЬ: Немного поиска, и я подтвердил (в основном), что виновата версия вашего времени выполнения VC ++. Вам нужно распространять версии, которые вы создали. Для этой цели SDK платформы обычно включает в себя модуль их слияния, но для них также часто существует VCRedist.exe. Попробуйте посмотреть загрузки Microsoft.

KB94885

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...