Windows 7, wersja 64-bitowa, problemy z biblioteką DLL

268

Mam problem z naszym plikiem wykonywalnym. Korzystam z tego 32-bitowego pliku C ++ na moim 64-bitowym pudełku programistycznym Windows 7, który ma również wszystkie te aplikacje Microsoft (Visual Studio 2008 + 2010, TFS, SDK, Microsoft Office) ... I nadal działa dobrze.

Teraz dostałem instalację klienta tego samego programu i zostałem poproszony o przetestowanie go przy użyciu czystej instalacji systemu Windows 7. Tak więc dostałem 64-bitowy VMware dla Windows 7 i zaktualizowałem go do Windows 7 SP 1 (ta sama wersja, którą tunuje moje okno programisty). Ale podczas gdy na moim pudełku programisty wszystko jest w porządku, program nie działa z pudełkiem VMware (30-dniowa wersja próbna).

Walker zależności x86 mówi mi, że brakuje następujących plików 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

Poszukałem tych plików DLL API-MS-WIN -... i stwierdziłem, że powinny one już być częścią systemu Windows 7 (niektóre witryny twierdzą, że należą do systemu Windows 8 i Windows Server 2012).

Próbowałem już sugerowanych poprawek, które znalazłem:

  • uruchamianie „sfc / scannow”
  • instalowanie plików wykonywalnych programu Visual Studio 2008 z dodatkiem SP1

Ale to niczego nie rozwiązało. :-(

Uwaga dodatkowa: Moje pudełko rozwojowe też ich nie ma i wydaje się, że ich nie potrzebuje. Na przykład user32.dll na moim urządzeniu nie łączy się z jednym z nich, podczas gdy instalacja na VMware tak.

Masz pomysł, jak rozwiązać ten problem? Próbowałem znaleźć odpowiedni plik do pobrania / naprawy na stronach Microsoft, ale nie udało mi się.


Po rozwiązaniu problemu chciałem zgłosić to, co się dowiedziałem, i nie mogę opublikować tego jako odpowiedzi, ponieważ pytanie zostało zamknięte.

Właściwie wszystkie pliki DLL zgłoszone przez narzędzie Dependency Walker zginęły, a mianowicie te

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

Pliki DLL typu nie były częścią rzeczywistego problemu.

W moim przypadku brakowało rejestracji trzech plików OCX, a potem wszystko było w porządku, ALE narzędzie Dependency Walker nadal wyświetlało te same pliki DLL, co wcześniej, nawet gdy program działał już dobrze.

Istota tego: jak ktoś inny stwierdził, narzędzie jest już trochę przestarzałe i nie zawsze działa poprawnie z nowszym systemem operacyjnym. Dlatego miej oko otwarte i nie daj się zwieść brakując „API-MS-WIN-CORE-COM-L1-1-0.DLL”… problem prawdopodobnie leży gdzie indziej.

tlvs
źródło
1
O ile mi wiadomo, funkcja DirectComposition nie jest dostępna w systemie Windows 7 (DCOMP.DLL).
Brian
156
Co powiesz na ponowne otwarcie? Moja wyszukiwarka Google doprowadziła mnie do tego pytania zaledwie 20 godzin po jego zamknięciu, ponieważ „raczej nie pomogę przyszłym użytkownikom” ...
Christian Severin
27
które 3 pliki OXX musiałaś zarejestrować, a co ważniejsze, jak to wymyśliłeś? Utknąłem w tym od kilku dni
Ben Brammer
2
Cześć wszystkim. Wydaje mi się, że to zrobiłem (patrz poniżej), ale na marginesie można bezpiecznie zignorować brak połączenia z IESHIMS.DLL i GPSVC.DLL. Pojawia się w zasadzie we wszystkim, co kompiluję w Win7 i wydaje się, że nie ma to żadnego wpływu na działanie. To doświadczenie pochodzi teraz z około 30+ plików binarnych. westchnienie Nienawidzę-nienawidzę-nienawidzę robić Windows Dev z takich powodów.
meawoppl,
3
Zmiany jądra systemu Windows 7, które doprowadziły do ​​bibliotek DLL api-ms-win- *, są dość dobrze wyjaśnione tutaj nirsoft.net/articles/windows_7_kernel_architecture_changes.html - myślę, że DependencyWalker po prostu nie radzi sobie z tymi zmianami - więc nie przejmuj się nimi zbytnio. Od MS: msdn.microsoft.com/en-us/library/hh802935%28v=vs.85%29.aspx
x29a

Odpowiedzi:

63

Ten problem jest związany z brakiem „pakietu redystrybucyjnego” programu Visual Studio. Nie jest oczywiste, którego brakuje, na podstawie ścieżki zależności, ale najpierw spróbuję tej, która odpowiada twojej wersji kompilatora i zobaczę, czy wszystko działa poprawnie:

Visual Studio 2015

Visual Studio 2013

Visual Studio 2010

Visual Studio 2008

Natknąłem się na ten problem, ponieważ korzystam z kompilatorów Visual Studio, ale nie pełnego środowiska Visual Studio.


Odważę się wstawić nowy link tutaj: Najnowsze obsługiwane pliki do pobrania Visual C ++ . Stein Åsmul, 29.11.2018 .

meawoppl
źródło
Zobacz także: stackoverflow.com/questions/7568697/…
meawoppl
1
Wygląda na to, że może to być spowodowane instalowaniem pakietów redystrybucyjnych w niektórych wersjach Win 7. Dzięki m $.
meawoppl
Ja też miałem z tym problemy i wierzę, że istnieje wiele ścieżek, aby to naprawić. W moim przypadku zauważyłem, że kompilacja z konfiguracją debugowania spowodowała, że ​​moja biblioteka nie zarejestrowała się. Jednak kiedy zmieniłem konfigurację do wydania, mogłem uzyskać czystą rejestrację. Moje środowisko to VS 2012. I skopiowałem odpowiednie pliki redist (wersja x64) do tego samego folderu, co moja biblioteka DLL.
Jim Kennedy,
Uwaga: niektóre z nowszych wygranych SDK / DDK pochodzą także z niektórymi z nich!
meawoppl
1
VS2015 vcredist _ *. Exe instaluje te biblioteki DLL, ale inne metody, takie jak MSM dostarczane z VS, nie. vcredist zawiera te biblioteki DLL i będziesz potrzebować minimalnej wymaganej platformy. (Uwaga: musiałem zainstalować system Windows 7 SP1 dwa razy, aby
zadziałał
19

Właśnie rozwiązałem ten sam problem z C ++ Qt 5 i Windows 7 64 bity z MSCVC 2012.

Na początku myślałem, że jest to problem z plikiem MSVC / Windows DLL, ale jak powiedział BorisP, problemem były moje zależności projektowe. Kluczem jest „ Jak poznać zależności projektu od Qt 5? ”.

Ponieważ nie znalazłem żadnego jasnego sposobu, aby to wiedzieć ( Dependency Walker nie bardzo mi pomógł ...), poszedłem następnie za „odwrotną procedurą”, która zajmuje nie więcej niż 5 minut i pozwala uniknąć wielu problemów z biblioteką DLL zależności plików:

  1. Skompiluj projekt i przenieś plik wykonywalny do pustego folderu: myproject.exe
  2. Spróbuj go uruchomić, odzyska błąd (brakujące pliki DLL ...).
  3. Teraz skopiuj wszystkie pliki DLL z Qt (w moim przypadku były one w C: \ Qt \ Qt5.1.1 \ 5.1.1 \ msvc2012_64_opengl \ bin) do tego folderu.
  4. Spróbuj wykonać ponownie, prawdopodobnie będzie dobrze działać.
  5. Zacznij stopniowo usuwać i próbuj za każdym razem, gdy plik wykonywalny nadal działa, starając się pozostawić minimum niezbędnych plików DLL.

Gdy wszystkie pliki DLL znajdują się w tym samym folderze, łatwiej jest ustalić, który z nich jest nieprawidłowy (XML, WebKit, ... cokolwiek ...), w związku z czym ta metoda nie zajmuje więcej niż pięć minut.

Inejose
źródło
Jeśli brakujące biblioteki DLL są zestawami GAC, ta metoda pomoże Ci zidentyfikować biblioteki DLL, których brakuje (komunikaty o błędach powinny wskazywać, którego zestawu nie można załadować), a następnie musisz dowiedzieć się, na którym zestawie narzędzi lub frameworku zainstalować maszyna do umieszczenia ich w GAC (lub dołączenia do Twojej dystrybucji).
rcabr
2
będzie to działać tylko w przypadku bezpośrednich zależności bibliotek DLL ładowanych podczas uruchamiania. jeśli twój program lub biblioteki DLL załadują niektóre biblioteki DLL opóźnione lub dynamicznie, nie możesz ich znaleźć przy swoim podejściu.
A. Binzxxxxxx
Uwaga: robienie tego w ten sposób uwrażliwia aplikację na kolejność zmiennej PATH, w niektórych przypadkach ładując wersje systemu, aw innych folderach lokalnych. M $ nazywa to problemem bezpieczeństwa, ale szczerze mówiąc to ich wina za użycie CWD w obciążeniach: support.microsoft.com/en-us/kb/2389418
meawoppl
3
Nie należy tego robić ręcznie. Jest na to windeployqtnarzędzie, patrz na przykład stackoverflow.com/a/33292008/4023446
Orest Hera
1
@OrestHera windeployqtczęsto kopiuje niepotrzebne pliki.
16

Właśnie rozwiązałem ten sam problem.

Zależność Walker wprowadza w błąd w tym przypadku i spowodował, że straciłem czas. Tak więc lista „brakujących” plików DLL z pierwszego postu nie jest pomocna i prawdopodobnie możesz ją zignorować.

Rozwiązaniem jest znalezienie, które referencje są twoje wywołuje projekt i sprawdzenie, czy są one naprawdę zainstalowane na serwerze.

@Ben Brammer, nie jest ważne, których brakuje trzech plików .ocx, ponieważ brakuje ich tylko w projekcie Leo T. Abrahama. Twój projekt prawdopodobnie wywołuje inne pliki DLL.

W moim przypadku nie były to trzy pliki .ocx, ale brak pliku DLL konektora MySQL. Po zainstalowaniu konektora MySQL dla platformy .NET na serwerze problem zniknął.

Krótko mówiąc, rozwiązaniem jest: sprawdź, czy są tam wszystkie odniesienia do twojego projektu.

BorisP
źródło
12

Jak wspomniano, DCOMP jest częścią redystrybucji VC ++ (implementującej środowisko wykonawcze OpenMP) i jest jedynym naprawdę brakującym komponentem. Cała reszta to fałszywe raporty.

W szczególności API-MS-WIN-XXXX.DLL to zestawy API - w zasadzie dodatkowy poziom pośrednictwa połączeń wprowadzany stopniowo od Windows 7. Dependency Walker Rozwój najwyraźniej na długo przed tym i nie może poprawnie obsługiwać zestawów API.

Więc nie ma się o co martwić. Nie stracisz nic więcej.

Lepszą alternatywą do znalezienia naprawdę potrzebnych plików DLL, które brakuje (jeśli rzeczywiście jest to problem), jest uruchomienie Monitora procesu i cofnięcie się od awarii, szukając sekwencji nieudanych sond dla określonego pliku DLL na całej ścieżce systemowej.

Ofek Shilon
źródło
+1 dla ProcessMonitor. Jest do pobrania za darmo od Microsoft. Dołącz do procesu Matlaba i możesz zobaczyć wszystko, co się dzieje, w tym dll-loady
Janus
6

Zetknąłem się również z tym problemem, ale rozwiązaniem, które wydaje się tutaj być powszechnym wątkiem, i widziałem gdzie indziej w Internecie, jest „[re] zainstaluj pakiet redystrybucyjny”. Jednak dla mnie to nie działa, ponieważ problem pojawił się podczas uruchamiania instalatora naszego produktu (który instaluje pakiet redystrybucyjny) w celu przetestowania naszych nowych, błyszczących kompilacji Visual Studio 2015.

Problem pojawił się, ponieważ wymienione pliki DLL nie znajdują się w ścieżce instalacji programu Visual Studio (na przykład C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ redist) i dlatego nie zostały dodane do instalacji. Te biblioteki api-ms-win- * są instalowane w ścieżce instalacyjnej zestawu Windows 10 SDK jako część instalacji programu Visual Studio 2015 (np. C: \ Program Files (x86) \ Windows Kits \ 10 \ Redist).

Instalacja w systemie Windows 10 działała dobrze, ale instalacja w systemie Windows 7 wymagała dodania tych plików DLL do naszej instalacji produktu. Aby uzyskać więcej informacji, zobacz Aktualizacja dla Universal C Runtime w systemie Windows, która opisuje dodanie tych zależności spowodowanych przez Visual Studio 2015 i zapewnia pobieranie dla różnych platform Windows; zobacz także Wprowadzenie do uniwersalnego CRT, który opisuje przeprojektowanie bibliotek CRT. Szczególnie interesujący jest punkt 6 w sekcji zatytułowanej Oprogramowanie dystrybucyjne korzystające z Universal CRT :

Zaktualizowano 11 września 2015: obsługiwane jest lokalne wdrożenie Universal CRT w lokalnej aplikacji. Aby uzyskać pliki binarne do wdrożenia lokalnego dla aplikacji, zainstaluj Windows Software Development Kit (SDK) dla systemu Windows 10. Pliki binarne zostaną zainstalowane w C: \ Program Files (x86) \ Windows Kits \ 10 \ Redist \ ucrt. Będziesz musiał skopiować wszystkie biblioteki DLL za pomocą aplikacji (pamiętaj, że zestaw plików DLL jest konieczny, jest różny w różnych wersjach systemu Windows, więc musisz dołączyć wszystkie pliki DLL, aby program mógł działać na wszystkich obsługiwanych wersjach Windows).

hlongmore
źródło
5

Ten wkład tak naprawdę nie odpowiada na początkowe pytanie, ale biorąc pod uwagę wskaźnik trafień tego wątku, zakładam, że sporo osób zajmuje się problemem, że nie można znaleźć bibliotek API-MS-WIN-CORE.

Udało mi się rozwiązać problem polegający na tym, że moja aplikacja odmówiła uruchomienia z komunikatem o błędzie, że nie można znaleźć API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL, po prostu aktualizując Visual Studio.

Nie sądzę, że moje środowisko kompilacji (Windows 7 Pro SP1, Visual Studio Ultimate 2012) zostało całkowicie pomieszane, działało dobrze dla większości moich projektów. Ale w niektórych bardzo szczególnych okolicznościach dostałem komunikat o błędzie (patrz poniżej).

Po zaktualizowaniu programu Visual Studio 11 z początkowej wersji dysku CD (zapomniałem sprawdzić numer wersji) do wersji 11.0.61030.00 Aktualizacja 4 również uszkodzony projekt uruchomił się ponownie.

Komunikat o błędzie podczas uruchamiania aplikacji

normanius
źródło
Link jest (skutecznie) uszkodzony ( „Przepraszamy, ten plik do pobrania nie jest już dostępny.” ).
Peter Mortensen,
@PeterMortensen Znalazłem ten link do aktualizacji 5 , ale nie mam pojęcia, czy sugerowane obejście nadal ma zastosowanie. Aktualizacja 4 nie jest już dostępna. Oto lista aktualizacji dla VS2012 . Podawana data zakończenia produktu to 10/2023.
normanius
3

To rozwiązało problem:

Odinstaluj pakiet redystrybucyjny Visual Studio 2010, jeśli już go zainstalowałeś, a następnie zainstaluj zestaw Microsoft Windows 7 SDK .

Krazibit312
źródło
1
Uwagi do instalacji sugerują odinstalowanie pakietów redystrybucyjnych, ponieważ zawierają one nadmiarowe wersje powyższych bibliotek DLL i spowodują zamieszanie w dynamicznym łączeniu kodu i innych form Win7 herp-derp. Dlaczego nie zrobi tego za Ciebie podczas instalacji, możemy bezpiecznie zapisać jako #iwishihadarealpackagemanager.
meawoppl,
1
też dla mnie pracował. tyle godzin spędzonych na nim, instalowanie .net directx, ale zadziałała ponowna instalacja msvc ++
NoWomenNoCry
2

Rozwiązałem problem. Kiedy zarejestrowałem pliki OCX, uruchomiłem je z oknem poleceń, które zostało wykonane jako administrator.

Kim
źródło
1

Dla każdego, kto tu przyszedł, ale ma problem z Photoshopem : moim rozwiązaniem było odinstalowanie najpierw redystrybucyjnej wersji MS VC ++ x86 i 64. Następnie zainstaluj jeden odpowiedni dla wersji i architektury systemu Windows (86 lub 64).

NoWomenNoCry
źródło
0

Instalacja programu SQL Server Management Studio 2014 na świeżo zainstalowanym systemie Windows 7 rozwiązała ten problem u naszego klienta po dwudniowej śmiesznej bitwie.

Łukasz S.
źródło
3
istnieje wiele innych odpowiedzi i być może byłby to najlepszy komentarz
Paul Bastide
0

Miałem ten sam problem. Po spędzeniu wielu godzin na wyszukiwaniu w sieci znalazłem rozwiązanie dla siebie.

Skopiowałem plik combase.dll (C: \ Windows \ System32) do folderu wydania i rozwiązał problem.

użytkownik2938031
źródło
2
Instalowanie losowych bibliotek DLL na twojej ścieżce to ZŁA POMYSŁ.
meawoppl
0

Przybyłem tutaj z tym problemem, po wypróbowaniu nowej instalacji OEM systemu Windows 7 i aktualizacji do Windows 10.

Po przeszukaniu forów Microsoft i podobnych znalazłem następujące rozwiązanie, które działało dla mnie:

Zamień C:\Windows10Upgrade\wimgapi.dllna ten zC:\Windows\System32\wimgapi.dll

djsmiley2kStaysInside
źródło
Instalowanie losowych bibliotek DLL na twojej ścieżce to ZŁA POMYSŁ.
meawoppl
Oczywiście, że tak, ale kiedy jest to zupełnie nowa instalacja, co jest do zrobienia? : D
djsmiley2kStaysInside
0

Sugeruję również sprawdzenie, ile pamięci jest aktualnie używane.

Okazuje się, że niemożność znalezienia tych plików DLL była pierwszym objawem występującym podczas próby uruchomienia programu (uruchomionego lub debugowanego) w programie Visual Studio.

Po ponad pół godziny z dużym drapaniem głowy, przeszukiwaniem sieci, uruchamianiem Monitora procesów i Menedżera zadań , i to zależy, zupełnie inny program, który działał od początku czasu, zgłosił, że „pamięć jest niska; spróbuj zatrzymać niektóre programy” lub niektóre takie. Po zabiciu Firefoksa, Thunderbirda i Monitora procesu, i wszystko zależy, wszystko znów działało.

Donald Locker
źródło
0

Aby potwierdzić odpowiedzi tutaj, moją decyzją było skopiowanie nie ładującego się pliku DLL ORAZ pliku ocx, który mu towarzyszył, do folderu system32, który rozwiązał mój problem.

po10cySA
źródło