Проблеми з 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 SP 1 (та сама версія, яку налаштовує моя скринька розробника). Але в моєму вікні розробника все нормально, програма не працює з вікном VMware (30 днів пробного періоду).

Прогулянковий хокер x86 повідомляє мені, що відсутні такі файли DLL:

  • API-MS-WIN-CORE-COM-L1-1-0.DLL
  • API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
  • API-MS-WIN-CORE-WINRT-L1-1-0.DLL
  • API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
  • API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
  • API-MS-WIN-SHCORE-SCALING-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 відсутня, і після цього все було просто нормально, але інструмент Walker Dependency Walker все ще перераховував усі ті самі файли DLL, що і раніше, навіть коли програма тільки зараз працює нормально.

Суть цього: Як зазначав хтось інший, інструмент на сьогоднішній день трохи застарів і не завжди працює належним чином з новою ОС. Таким чином, тримайте очі відкритими і не вводите в оману, пропускаючи "API-MS-WIN-CORE-COM-L1-1-0.DLL", ... проблема, ймовірно, лежить повністю в іншому місці.


1
Наскільки я знаю, DirectComposition не доступний у Windows 7 (DCOMP.DLL).
Брайан

156
Як щодо повторного відкриття цього? Мій пошук в Google привів мене до цього питання лише через 20 годин після закриття, оскільки він "навряд чи допоможе майбутнім відвідувачам" ...
Крістіан Северин

27
які 3 окс файли вам довелося зареєструвати, і що ще важливіше, як ви це зрозуміли? Я затримався на цьому вже кілька днів
Бен Браммер

2
Гей всі. Я думаю, що це я прибив цвяхом (див. Нижче), але в якості побічної примітки ви можете сміливо ігнорувати невдачу посилання на IESHIMS.DLL та GPSVC.DLL. Це в основному все, що я збираю в Win7, і, здається, не має ніяких наслідків для функції. Цей досвід базується приблизно на 30+ бінарних файлах. зітхати Я ненавиджу-ненавижу-ненавиджу робити Windows Dev з таких причин.
meawoppl

3
Зміни ядра Windows 7, які призвели до api-ms-win- * DLL-файлів пояснюються тут досить добре nirsoft.net/articles/windows_7_kernel_architecture_changes.html - я думаю, що DependencyWalker просто не може впоратися з цими змінами - тому не варто турбуватися про них занадто багато. Від MS: msdn.microsoft.com/en-us/library/hh802935%28v=vs.85%29.aspx
x29a

Відповіді:


63

Ця проблема пов'язана з відсутністю "перерозподільного пакета" Visual Studio. Не очевидно, якого з них не вистачає на основі прогулянки залежністю, але я спробую спершу відповідний вашій версії компілятора і побачити, чи все працює належним чином:

Візуальна студія 2015

Visual Studio 2013

Visual Studio 2010

Visual Studio 2008

Я зіткнувся з цією проблемою, оскільки використовую компілятори Visual Studio, але не повне середовище Visual Studio.


Смію надати тут нове посилання: Останні підтримувані завантаження Visual C ++ . Штейн Есмул, 29.11.2018 .


Дивіться також: stackoverflow.com/questions/7568697 / ...
meawoppl

1
Крім того, здається, що це може бути викликано встановленням пакетів, що перерозподіляються, на деяких версіях Win 7. Спасибі m $.
meawoppl

У мене теж були проблеми з цим, і я вважаю, що існує багато шляхів до його виправлення. У моєму випадку я помітив, що компіляція з конфігурацією налагодження призвела до того, що мій comdll не реєструвався. Однак, коли я змінив конфігурацію на реліз, мені вдалося мати чисту реєстрацію. Моє середовище VS 2012. І я скопіював належні файли redist (версія x64) у ту саму папку, що і мій com dll.
Джим Кеннеді

Зверніть увагу: деякі з нових виграшів приходять SDK / DDK, а також деякі з них!
meawoppl

1
VS2015 vcredist _ *. Exe встановлює ці DLL, але інших методів, таких як MSM, що постачаються з VS, немає. vcredist включає ці DLL, і вам знадобиться мінімально необхідна платформа. (Зауважте, мені довелося встановити Windows 7 sp1 двічі, щоб це
набуло

19

Я щойно вирішив ту саму проблему з C ++ Qt 5 та Windows 7 64 бітами з MSCVC 2012.

На початку я думав, що це проблема файлів MSLC / Windows DLL, але, як сказав Борис, проблема була в моїх проектних залежностях. Ключ - " Як дізнатися про залежність вашого проекту в Qt 5? ".

Оскільки я не знайшов чіткого способу це знати ( Уокер Залежності не дуже мені допоміг ...), я дотримувався наступної "зворотної процедури", яка займає не більше 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, ... що б там не було ..), і, отже, цей спосіб не займає більше п'яти хвилин.


Якщо 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
Орест Гера

1
@OrestHera windeployqtчасто копіює непотрібні файли.

16

Я просто вирішив ту саму проблему.

Залежність Уокер в цьому випадку вводить в оману і змушує мене втрачати час. Отже, список "відсутніх" файлів DLL з першого повідомлення не є корисним, і ви, ймовірно, можете його проігнорувати.

Рішення полягає в тому, щоб знайти, які посилання викликає ваш проект, і перевірити, чи дійсно вони встановлені на сервері.

@Ben Brammer, не важливо, які три файли .ocx відсутні, оскільки вони відсутні лише для проекту Лео Т Авраама. Ваш проект, ймовірно, викликає інші файли DLL.

У моєму випадку це були не три .ocx файли, але відсутній файл DLL-з'єднувача MySQL. Після встановлення MySQL Connector для .NET на сервері проблема зникла.

Отже, коротше кажучи, рішення таке: перевірте, чи всі посилання на ваш проект є.


12

Як вже згадувалося, DCOMP є частиною перерозподілюваних VC ++ (реалізуючи час виконання OpenMP) і є єдиним істинно відсутнім компонентом. Все інше - помилкові повідомлення.

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

Тож тут нема чого хвилюватися. Ти більше нічого не пропускаєш.

Кращою альтернативою знайти справді потрібні файли DLL, яких немає (якщо це справді проблема) - запустити Monitor Monitor і відступити від відмови, шукаючи послідовності помилок зондів для конкретного файлу DLL у всьому системному шляху.


+1 для ProcessMonitor. Це безкоштовне завантаження з Microsoft. Приєднайтеся до процесу matlab, і ви зможете побачити все, що відбувається, в тому числі dll-load
Janus

6

Я також зіткнувся з цією проблемою, але рішення, яке, здається, є загальною ниткою тут, і я побачив в іншому просторі в Інтернеті, - це "[повторно встановити пакет, що перерозподіляється". Однак для мене це не працює, оскільки проблема виникла під час запуску інсталятора нашого продукту (який встановлює перерозподільний пакет) для тестування нашої блискучої нової версії Visual Studio 2015.

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

Установка в Windows 10 спрацювала нормально, але для встановлення на Windows 7 потрібно додати ці DLL-файли до нашого продукту. Для отримання додаткової інформації див. Оновлення для Universal C Runtime у Windows, де описано доповнення цих залежностей, викликаних Visual Studio 2015, та передбачено завантаження для різних платформ Windows; також див. Введення універсальної CRT, яка описує редизайн бібліотек CRT. Особливий інтерес викликає пункт 6 у розділі " Розповсюдження програмного забезпечення", що використовує Універсальну CRT :

Оновлено 11 вересня 2015 року: підтримується локальне розгортання додатків Universal CRT. Щоб отримати бінарні файли для локального розгортання додатків, встановіть комплект для розробки програмного забезпечення Windows (SDK) для Windows 10. Бінарні файли будуть встановлені на C: \ Program Files (x86) \ Windows Kits \ 10 \ Redist \ ucrt. Вам потрібно буде скопіювати всі DLL разом із вашим додатком (зауважте, що набір файлів DLL необхідний, різний у різних версіях Windows, тому ви повинні включити всі файли DLL для того, щоб ваша програма працювала на всіх підтримуваних версіях Windows).


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 Оновлення 4, також зламаний проект запустився знову.

Повідомлення про помилку при запуску програми


Посилання (фактично) порушено ( "На жаль, ця завантаження більше не доступна." ).
Пітер Мортенсен

@PeterMortensen Я знайшов це посилання на Оновлення 5 , але не маю уявлення, чи запропонований спосіб вирішення все ще діє. Оновлення 4 більше не доступне. Ось список оновлень для VS2012 . Повідомлена дата закінчення товару - 10/2023.
норманій

3

Це вирішило для мене питання:

Видаліть перерозподільний пакет Visual Studio 2010, якщо він уже встановлений, та встановіть Microsoft Windows 7 SDK .


1
Примітки про встановлення пропонують вам видалити пакети перерозподілу, оскільки вони містять надлишкові версії вищезгаданих DLL-файлів і спричинить динамічну плутанину посилань на код та інші форми herp-derp Win7. Чому це не зробить це для вас під час встановлення, ми можемо безпечно подати як #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 вирішило цю проблему у нашого клієнта після дводенного смішного бою.


3
Є багато інших відповідей, і, можливо, це було б найкраще як коментар
Пол Бастіде

0

У мене була така ж проблема. Провівши години в пошуку в Інтернеті, я знайшов для себе рішення.

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


2
Встановлення випадкових dll на вашому шляху - BAD IDEA.
meawoppl

0

Я прийшов сюди з цією проблемою, після спробу нової установки Windows 7 OEM, оновлення до Windows 10.

Після деяких пошуків форумів Microsoft, і я знайшов таке рішення, яке працювало для мене:

Замініть C:\Windows10Upgrade\wimgapi.dllна той, зC:\Windows\System32\wimgapi.dll


Встановлення випадкових dll на вашому шляху - BAD IDEA.
meawoppl

Звичайно, це так, але коли це абсолютно нова установка, що тут зламати? : D
djsmiley2kStaysInside

0

Пропоную також перевірити, скільки пам’яті зараз використовується.

Виявляється, неможливість знайти ці файли DLL була першим симптомом, виявленим при спробі запуску програми (або запустити, або налагодити) у Visual Studio.

Після закінчення півгодини з численними подряпинами в голові, пошуку в Інтернеті, запуску монітора процесів та диспетчера завдань , і залежить, зовсім інша програма, що працює з початку часу, повідомила, що "пам'ять мало; спробуйте зупинити деякі програми" або дещо таке. Після вбивства Firefox, Thunderbird, Process Monitor і все залежить знову.


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.