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.


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 .



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.


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.


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.


+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).


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


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 .


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.


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



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.


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


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.