Ошибка инициализации программы (0xc0150002), когда запуск программы зависит от сторонних DLL - PullRequest
1 голос
/ 27 декабря 2011

Когда я пишу программу на c ++ (например, B3DTest.exe), зависит от сторонней библиотеки DLL (например, B3DViews.dll) (поставщик - небольшая компания).Программа, которую я написал, очень проста - просто протестировать одну функцию в dll.Когда я запускаю свою программу (необходимый заголовочный файл, файлы .lib и файл .dll связаны).Я сталкиваюсь с проблемой ниже.

The application failed to initialize properly (0xc0150002). Click on OK to terminate 
the application.

Я обнаруживаю, что программа завершается, прежде чем войти в мою основную функцию.Выход IDE vs2008

LDR: LdrpWalkImportDescriptor() failed to probe e:\tlh1987\vs2008projects\B3DTest\Debug\B3DViews.dll
for its manifest, ntstatus 0xc0150002

Я поместил программу и DLL в другой целевой компьютер, и он работает нормально.Так что я думаю, что-то не так с моим компьютером.Я искал в журнале событий, и там написано три события

EventID: 32
Description: Dependent Assembly Microsoft.VC80.CRT could not be found and Last Error was The referenced     
assembly is not installed on your system.
EventID: 59
Description: Resolve Partial Assembly failed for Microsoft.VC80.CRT. Reference error message: The    
referenced assembly is not installed on your system.
EventID: 59
Description: Generate Activation Context failed for Generate Activation Context
E:\tlh1987\vs2008projects\B3DTest\Debug\B3DViews.dll. Reference error message: The operation completed
successfully.

. Я ищу в Интернете, чтобы выяснить, что кто-то исправляет подобную проблему, установив Microsoft Visual C++ 2005 Redistributable Package и Microsoft Visual C++ 2005 SP1 Redistributable Package (x86).
.два файла и установил его.Тем не менее, это не могло работать!Другое решение в Интернете - Поместите файлы папки Microsoft.VC80.CRT, которые включают в себя 3 dll и папку Microsoft.VC80.MFC (также включают 4 dll) и, наконец, соответствующие файлы манифеста в каталоге B3DTest.exe (моя программа),Однако, это все еще не работало!Но что-то изменило event log, где есть только 1 event error, который говорит ниже:

EventID: 59
Description: Generate Activation Context failed for Generate Activation Context
E:\tlh1987\vs2008projects\B3DTest\Debug\B3DViews.dll. Reference error message: The operation completed
successfully.

Кто-то сказал мне, что это может быть версия VC80.CRT и VC80.MFC на моем компьютерене соответствует номеру версии в B3DViews.dll (который распространяется поставщиком).Затем я открываю B3DViews.dll с помощью emacs.exe и ищу манифест, прикрепленный к dll.Ниже написано:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
  <dependentAssembly>
  <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195"    
  processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
  </dependentAssembly>
</dependency>
<dependency>
  <dependentAssembly>
  <assemblyIdentity type="win32" name="Microsoft.VC80.MFC" version="8.0.50727.6195" 
processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
  <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" 
  processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
  </dependentAssembly>
</dependency>
<dependency>
  <dependentAssembly>
  <assemblyIdentity type="win32" name="Microsoft.VC80.MFC" version="8.0.50608.0" 
  processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
  </dependentAssembly>
</dependency>
</assembly>

номер версии меня запутал.Как это может быть 8.0.50727.6195, а также 8.0.50608.0 Кажется, это должен быть один номер версии (а не два, как показано выше).Я нахожу dll Microsoft.VC80.CRT и dll Microsoft.VC80.MFC, а также соответствующие файлы манифеста (все номера версий 8.0.50727.6195 в C: \ Windows \ WinSxS и помещаю его в dir так же, как B3DTest.exe (моя программа). Она также не может работать. Чтобы выяснить проблему. Я использовал Dependency Walker for Win32 (x86) для профилирования моей программы, то есть B3DTest.exe. Там написано:

Started "B3DTEST.EXE" (process 0x680) at address 0x00400000.  Successfully hooked module.
Loaded "NTDLL.DLL" at address 0x7C920000.  Successfully hooked module.
Loaded "KERNEL32.DLL" at address 0x7C800000.  Successfully hooked module.
DllMain(0x7C920000, DLL_PROCESS_ATTACH, 0x00000000) in "NTDLL.DLL" called.
DllMain(0x7C920000, DLL_PROCESS_ATTACH, 0x00000000) in "NTDLL.DLL" returned 1 (0x1).
DllMain(0x7C800000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNEL32.DLL" called.
DllMain(0x7C800000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNEL32.DLL" returned 1 (0x1).
Injected "DEPENDS.DLL" at address 0x08370000.
DllMain(0x08370000, DLL_PROCESS_ATTACH, 0x00000000) in "DEPENDS.DLL" called.
DllMain(0x08370000, DLL_PROCESS_ATTACH, 0x00000000) in "DEPENDS.DLL" returned 1 (0x1).
Loaded "B3DVIEWS.DLL" at address 0x10000000.  Successfully hooked module.
LDR: LdrpWalkImportDescriptor() failed to probe e:\tlh1987\vs2008projects\b3dtest\debug\B3DViews.dll 
for its manifest, ntstatus 0xc0150002
First chance exception 0xC0150002 (Unknown) occurred in "NTDLL.DLL" at address 0x7C9873BE.
**Second chance exception 0xC0150002 (Unknown) occurred in "NTDLL.DLL" at address 0x7C9873BE.**
Exited "B3DTEST.EXE" (process 0x680) with code -1072365566 (0xC0150002).

Это сводит меня с ума. Я не хочу в этом разбираться. Любая помощь будет признательна!
Это (http://www.codeguru.com/forum/showthread.php?t=408061) может помочь в решении проблемы. Но я не могу понять это, прочитав ее. Моя системаWindows XP SP3 и я использую VS2008. Я не устанавливал VS2005.

Ответы [ 3 ]

1 голос
/ 06 июня 2013

Во-первых, я удалил весь распространяемый пакет Microsoft Visual C ++ 2005, во-вторых, я установил Microsoft Visual C ++ 2005 SP1 распространяемый пакет напрямую (x86).Это тоже не сработало, но когда я установил

Visual C ++ 2005 с пакетом обновления 1 (SP1), обновление для системы безопасности MFC

Это просто работает

1 голос
/ 20 декабря 2013

0xC0150002L - это STATUS_SXS_CANT_GEN_ACTCTX.Инструмент для отладки проблем контекста активации - SxsTrace.Попробуйте это:

touch program.exe
SxsTrace Trace -logfile:SxsTrace.etl
[run program.exe]
SxsTrace Parse -logfile:SxsTrace.etl -outfile:SxsTrace.txt

SxsTrace.txt будет содержать имя сборки, на которую есть ссылка, и которую невозможно найти.

1 голос
/ 28 декабря 2011

Я как-то понял.с помощью этого Q & A

http://social.msdn.microsoft.com/Forums/nb-NO/vssetup/thread/fa559cb7-eabc-4f41-a3bc-84ed7ae089fc

сначала я удалил все Microsoft Visual C++ 2005 Redistributable Package

секунды, я установил Microsoft Visual C++ 2005 SP1 Redistributable Package (x86) напрямую.Это тоже не сработало, но когда я установил

Visual C ++ 2005 Service Pack 1, распространяемый пакет Обновление безопасности MFC

Это просто работает.Похоже, что обновите старую версию Microsoft Visual C++ 2005 Redistributable Package, а затем заставьте работать новую (sp1).

...