Windows 7, 64 бит, проблемы с DLL

268

У меня проблема с нашим исполняемым файлом. Я использую этот 32-битный исполняемый файл C ++ на моем 64-битном компьютере для разработки под Windows 7, в котором также есть все эти приложения Microsoft (Visual Studio 2008 + 2010, TFS, SDK, Microsoft Office) ... И он все еще работает нормально.

Теперь я получил клиентскую установку той же самой программы и меня попросили проверить ее с чистой установкой Windows 7. Таким образом, я получил 64-разрядную версию VMware для Windows 7 и обновил ее до Windows 7 с пакетом обновления 1 (та же версия, которую настраивает мой разработчик). Но в то время как на моем компьютере разработчика все в порядке, программа не работает с устройством VMware (30-дневная пробная версия).

X86 Dependency Walker сообщает мне, что отсутствуют следующие DLL-файлы:

  • API-MS-WIN-ОСНОВНОЙ-COM-L1-1-0.DLL
  • API-MS-WIN-ОСНОВНОЙ-WinRT-ОШИБКА-L1-1-0.DLL
  • API-MS-WIN-ОСНОВНОЙ-WinRT-L1-1-0.DLL
  • API-MS-WIN-ОСНОВНОЙ-WinRT-ROBUFFER-L1-1-0.DLL
  • API-MS-WIN-ОСНОВНОЙ-WinRT-СТРОКА-L1-1-0.DLL
  • API-MS-WIN-SHCORE-ШКАЛИРОВАНИЕ-L1-1-0.DLL
  • DCOMP.DLL
  • GPSVC.DLL
  • ieshims.dll

Я погуглил эти DLL-файлы API-MS-WIN -... и обнаружил, что они уже должны быть частью Windows 7 (хотя некоторые сайты утверждают, что они принадлежат Windows 8 и Windows Server 2012).

Я уже попробовал предложенные исправления, которые я нашел:

  • работает 'SFC / SCANNOW'
  • установка исполняемых файлов среды выполнения Visual Studio 2008 SP1

Но это ничего не решило. :-(

Примечание: у моей коробки разработки их тоже нет, и, похоже, они не нужны. Например, user32.dll на моем компьютере не связывается с одним из них, в то время как установка на VMware делает.

Есть идеи, как решить эту проблему? Я пытался найти подходящую загрузку / исправление на страницах Microsoft, но мне не удалось.


После решения моей проблемы я хотел сообщить о том, что я узнал, и я не могу опубликовать это как ответ, потому что вопрос был закрыт.

Фактически все DLL-файлы, о которых сообщалось, что они пропали без вести с помощью инструмента Dependency Walker, а именно

* API-MS-WIN-CORE-...

Тип DLL-файлов не был частью реальной проблемы.

В моем случае регистрация трех файлов OCX отсутствовала, и после этого все было просто отлично, но НОУ Dependency Walker по-прежнему перечислял все те же самые DLL-файлы, что и раньше, даже когда программа сейчас работала нормально.

Суть этого: как кто-то сказал в другом месте, инструмент немного устарел и не всегда работает должным образом с более новой ОС. Таким образом, следите за обновлениями и не вводите в заблуждение, пропуская «API-MS-WIN-CORE-COM-L1-1-0.DLL», ... проблема, вероятно, кроется совсем в другом месте.

TLVs
источник
1
Насколько мне известно, DirectComposition недоступен в Windows 7 (DCOMP.DLL).
Брайан
156
Как насчет повторного открытия этого? Мой поиск в Google привел меня к этому вопросу всего через 20 часов после того, как он был закрыт за то, что он «вряд ли поможет будущим посетителям» ...
Кристиан Северин
27
какие 3 ocx файла вам нужно было зарегистрировать, и, что более важно, как вы это выяснили? Я застрял на этом в течение нескольких дней
Бен Браммер
2
Всем привет. Я думаю, что я прибил этот (см. Ниже), но как примечание, вы можете смело игнорировать сбой ссылки на IESHIMS.DLL и GPSVC.DLL. Он подходит практически ко всему, что я компилирую в Win7, и, похоже, не влияет на работу. Этот опыт взят из примерно 30+ бинарных файлов сейчас. вздох я ненавижу ненавижу ненавижу делать Windows Dev по причинам, подобным этому.
Meawoppl
3
Изменения в ядре Windows 7, которые привели к появлению DLL-файлов api-ms-win- *, достаточно хорошо объяснены здесь . От MS: msdn.microsoft.com/en-us/library/hh802935%28v=vs.85%29.aspx
x29a

Ответы:

63

Эта проблема связана с отсутствием в Visual Studio «распространяемого пакета». Неясно, какой из них отсутствует в зависимости от обхода зависимостей, но я бы сначала попробовал тот, который соответствует версии вашего компилятора, и посмотрю, все ли работает правильно:

Visual Studio 2015

Visual Studio 2013

Visual Studio 2010

Visual Studio 2008

Я столкнулся с этой проблемой, потому что я использую компиляторы Visual Studio, но не всю среду Visual Studio.


Собираюсь добавить новую ссылку здесь: последние поддерживаемые загрузки Visual C ++ . Штейн Осмул, 29.11.2018 .

meawoppl
источник
Смотрите также: stackoverflow.com/questions/7568697/…
meawoppl
1
Кроме того, похоже, что это может быть вызвано установкой распространяемых пакетов в некоторых версиях Win 7. Спасибо, m $.
Meawoppl
У меня тоже были проблемы с этим, и я считаю, что есть несколько способов исправить это. В моем случае я заметил, что компиляция с конфигурацией отладки заставила мой dll не регистрироваться. Однако, когда я изменил свою конфигурацию на выпуск, я смог получить чистую регистрацию. Мое окружение - VS 2012. И я скопировал правильные файлы перенаправления (версия x64) в ту же папку, что и мой com dll.
Джим Кеннеди
Примечание: некоторые из новых SDK / DDK выигрышей идут с некоторыми из них!
Meawoppl
1
VS2015 vcredist _ *. Exe устанавливает эти библиотеки DLL, но другие методы, такие как MSM, поставляемые с VS, не устанавливают. vcredist включает эти библиотеки DLL, и вам потребуется минимально необходимая платформа. (Заметьте, мне пришлось дважды установить windows 7 sp1, чтобы он вступил в силу - В.У. соврал!) Microsoft.com/en-us/download/details.aspx?id=48234
GilesDMiddleton
19

Я только что решил ту же проблему с C ++ Qt 5 и Windows 7 64 бит с MSCVC 2012.

Сначала я думал, что это проблема с файлом DLL MSVC / Windows, но, как сказал Борис, проблема была в зависимости моего проекта. Ключ « Как узнать зависимости вашего проекта в Qt 5? ».

Поскольку я не нашел четкого способа узнать это ( Dependency Walker мне не сильно помог ...), я следовал следующей «обратной процедуре», которая занимает не более 5 минут и избегал многих головных болей с DLL файловые зависимости:

  1. Скомпилируйте ваш проект и поместите исполняемый файл в пустую папку: myproject.exe
  2. Попробуйте выполнить его, он получит ошибку (отсутствуют файлы DLL ...).
  3. Теперь скопируйте все файлы DLL из Qt (в моем случае они были в C: \ Qt \ Qt5.1.1 \ 5.1.1 \ msvc2012_64_opengl \ bin) в эту папку.
  4. Попробуйте выполнить снова, это, вероятно, будет работать нормально.
  5. Начните постепенно удалять и попробуйте каждый раз, когда ваш исполняемый файл все еще работает, пытаясь оставить минимально необходимые файлы DLL.

Когда у вас есть все DLL-файлы в одной папке, легче определить, какие из них недопустимы (XML, WebKit, ... что угодно ...), и, следовательно, этот метод не займет более пяти минут.

Inejose
источник
Если отсутствующие библиотеки DLL являются сборками GAC, этот метод поможет вам определить, какие библиотеки DLL отсутствуют (в сообщениях об ошибках должно быть указано, какую сборку не удалось загрузить), а затем вам нужно будет выяснить, на какой инструментарий или инфраструктуру установить. машина, чтобы поместить их в GAC (или включить в ваш дистрибутив).
rcabr
2
это будет работать только для прямых зависимостей dll, загруженных при запуске. если ваша программа или dll загрузят некоторые dll с задержкой или динамически, вы не сможете найти их при вашем подходе.
A. Binzxxxxxx
Также отметим, что при этом способе приложение становится чувствительным к порядку переменной PATH, загружая системные версии в некоторых случаях и версии в локальных папках в других. M $ называет это проблемой безопасности, но, честно говоря, это их вина за использование CWD в нагрузках: support.microsoft.com/en-us/kb/2389418
meawoppl
3
Это не должно быть сделано вручную. Для этого есть windeployqtинструмент, см., Например, stackoverflow.com/a/33292008/4023446
Orest Hera
1
@OrestHera windeployqtчасто копирует ненужные файлы.
16

Я просто решил ту же проблему.

Зависимость Уокер вводит в заблуждение в этом случае и заставляет меня терять время. Итак, список «отсутствующих» DLL-файлов из первого поста не полезен, и вы, вероятно, можете его игнорировать.

Решение состоит в том, чтобы найти ссылки, которые вызывает ваш проект, и проверить, действительно ли они установлены на сервере.

@Ben Brammer, не важно, какие три файла .ocx отсутствуют, потому что они отсутствуют только для проекта Лео Т Абрахама. Ваш проект, вероятно, вызывает другие файлы DLL.

В моем случае это были не три файла .ocx, а отсутствующий файл DLL коннектора MySQL. После установки MySQL, Connector для .NET на сервер, проблема исчезла.

Короче говоря, решение таково: проверьте, все ли ссылки на ваши проекты есть.

BorisP
источник
12

Как уже упоминалось, DCOMP является частью распространяемого пакета VC ++ (реализующего среду выполнения OpenMP) и является единственным действительно отсутствующим компонентом. Все остальные являются ложными сообщениями.

В частности, API-MS-WIN-XXXX.DLL являются API-наборами - по сути, дополнительный уровень косвенной обработки вызовов постепенно вводится со времен Windows 7. Разработка Dependency Walker, по- видимому, остановилась задолго до этого, и она не может правильно обрабатывать наборы API.

Так что не о чем беспокоиться. Вы не пропустите ничего больше.

Лучшей альтернативой для поиска действительно необходимых DLL-файлов, которые отсутствуют (если это действительно проблема), является запуск Process Monitor и откат в сторону от ошибки, поиск последовательностей неисправных зондов для конкретного DLL-файла по всему системному пути.

Офек Шилон
источник
+1 для ProcessMonitor. Это бесплатная загрузка от Microsoft. Присоединитесь к процессу Matlab, и вы сможете увидеть все, что происходит, включая dll-нагрузки
Janus
6

Я также столкнулся с этой проблемой, но решение, которое, как мне кажется, является здесь общим потоком, и которое я видел в других местах в Интернете, заключается в «[переустановке] распространяемого пакета». Однако для меня это не работает, так как проблема возникла при запуске установщика для нашего продукта (который устанавливает распространяемый пакет) для тестирования наших новых блестящих сборок Visual Studio 2015.

Проблема возникла из-за того, что перечисленные DLL-файлы не находятся в пути установки Visual Studio (например, C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ redist) и, следовательно, не были добавлены в установку. Эти api-ms-win- * dll устанавливаются в путь установки Windows 10 SDK как часть установки Visual Studio 2015 (например, C: \ Program Files (x86) \ Windows Kits \ 10 \ Redist).

Установка в Windows 10 работала нормально, но установка в Windows 7 требовала добавления этих файлов DLL в нашу установку продукта. Дополнительные сведения см. В разделе « Обновление среды выполнения Universal C в Windows», в котором описывается добавление этих зависимостей, вызванных Visual Studio 2015, и предоставляются загрузки для различных платформ Windows; также см. Представление Универсальной CRT, которая описывает модернизацию библиотек CRT. Особый интерес представляет пункт 6 в разделе « Распространение программного обеспечения, в котором используется универсальный ЭЛТ» :

Обновлено 11 сентября 2015 г. Поддерживается локальное развертывание универсального CRT на уровне приложений. Чтобы получить двоичные файлы для локального развертывания приложения, установите Windows Software Development Kit (SDK) для Windows 10. Двоичные файлы будут установлены в C: \ Program Files (x86) \ Windows Kits \ 10 \ Redist \ ucrt. Вам нужно будет скопировать все библиотеки DLL с вашим приложением (обратите внимание, что набор файлов DLL необходим для разных версий Windows различен, поэтому вы должны включить все файлы DLL, чтобы ваша программа работала на всех поддерживаемых версиях Windows).

hlongmore
источник
5

Этот вклад на самом деле не отвечает на первоначальный вопрос, но принимая во внимание частоту появления этого потока, я предполагаю, что довольно много людей имеют дело с проблемой, что библиотеки API-MS-WIN-CORE-не могут быть найдены.

Мне удалось решить проблему, когда мое приложение отказалось запускаться с сообщением об ошибке, что API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL не найден простым обновлением Visual Studio.

Я не думаю, что моя среда сборки (Windows 7 Pro SP1, Visual Studio Ultimate 2012) была полностью испорчена, она работала нормально для большинства моих проектов. Но при некоторых очень специфических обстоятельствах я получил сообщение об ошибке (см. Ниже).

После обновления Visual Studio 11 с исходной CD-версии (я забыл посмотреть номер версии) до версии 11.0.61030.00 Update 4 также снова был запущен сломанный проект.

Сообщение об ошибке при запуске приложения

normanius
источник
Ссылка (эффективно) не работает ( «К сожалению, эта загрузка больше не доступна». )
Питер Мортенсен
@PeterMortensen Я нашел эту ссылку на обновление 5 , но понятия не имею, применяется ли предложенный обходной путь. Обновление 4 больше не доступно. Вот список обновлений для VS2012 . Заявленная дата окончания продукта - 10/2023.
Норманиус
3

Это решило проблему для меня:

Удалите распространяемый пакет Visual Studio 2010, если он уже установлен, а затем установите Microsoft Windows 7 SDK .

Krazibit312
источник
1
Замечания по установке предлагают вам удалить распространяемые пакеты, так как они содержат избыточные версии вышеуказанных библиотек DLL, и это приведет к путанице с динамическими ссылками для кода и других форм Win7 herp-derp. Почему это не будет делать для вас во время установки, мы можем смело подать как #iwishihadarealpackagemanager.
meawoppl
1
работал для меня тоже. так много часов было потрачено на него, включая .net directx, но переустановка msvc ++ работала
NoWomenNoCry
2

Я решил проблему. Когда я зарегистрировал файлы OCX, я запустил его в командном окне, которое было выполнено от имени администратора.

Ким
источник
1

Для всех, кто пришел сюда, но с проблемой Photoshop : мое решение было удалить MS VC ++, распространяемый сначала x86 и 64 оба. Затем установите версию, соответствующую версии и архитектуре Windows (86 или 64).

Нет женщин - нет слез
источник
0

Установка SQL Server Management Studio 2014 на недавно установленную Windows 7 решила эту проблему на нашем клиенте после двухдневной нелепой битвы.

LukaszS
источник
3
существует множество других ответов, и, возможно, будет лучше, если это будет комментарий
Пол Бастид,
0

У меня такая же проблема. Потратив часы на поиск в Интернете, я нашел решение для себя.

Я скопировал файл combase.dll (C: \ Windows \ System32) в папку релиза, и это решило проблему.

user2938031
источник
2
Установка случайных DLL на вашем пути - ПЛОХАЯ ИДЕЯ.
Meawoppl
0

Я пришел сюда с этой проблемой, после попытки новой установки Windows 7 OEM, обновления до Windows 10.

После некоторых поисков на форумах Microsoft и таких, я нашел следующее решение, которое работало для меня:

Заменить C:\Windows10Upgrade\wimgapi.dllна один изC:\Windows\System32\wimgapi.dll

djsmiley2kStaysInside
источник
Установка случайных DLL на вашем пути - ПЛОХАЯ ИДЕЯ.
Meawoppl
Конечно, но когда новая установка, что тут сломать? : D
djsmiley2kStaysInside
0

Я предлагаю также проверить, сколько памяти в настоящее время используется.

Оказывается, невозможность найти эти DLL-файлы была первым симптомом, проявленным при попытке запустить программу (либо запустить, либо отладить) в Visual Studio.

После более чем получаса с большим количеством царапин на голове, поиском в Интернете, запуском Process Monitor и Task Manager и, в зависимости от ситуации, совершенно другой программы, которая запускалась с начала времен, сообщалось, что «недостаточно памяти; попробуйте остановить некоторые программы» или что-то подобное. После убийства Firefox, Thunderbird, Process Monitor и других, все снова заработало.

Дональд Локер
источник
0

Просто чтобы подтвердить ответы здесь, я решил скопировать DLL, которая не загружалась, и файл ocx, который сопровождал его, в папку system32, которая разрешила мою проблему.

po10cySA
источник