Ошибка инициализации программы (0xc0150002), когда запуск программы зависит от сторонней dll

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

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

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

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 и помещаю их в каталог так же, как 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.


person toolchainX    schedule 27.12.2011    source источник
comment
Этот манифест перепутан, похоже, что эта DLL была связана с кодом, созданным с помощью бета-версии VS2005. Вам нужно будет получить лучшую сборку, обратитесь к поставщику или автору за поддержкой.   -  person Hans Passant    schedule 27.12.2011
comment
@HansPassant Но это хорошо работает на компьютере моего коллеги. Я просто хочу, чтобы это работало. может быть трудно связаться с продавцом.   -  person toolchainX    schedule 28.12.2011
comment
Похоже, что только мой компьютер дал сбой при запуске программы.   -  person toolchainX    schedule 28.12.2011
comment
@HansPassant все равно спасибо за помощь.   -  person toolchainX    schedule 28.12.2011
comment
Трудно поверить, что никто не проголосовал за это только из-за относительных усилий: +1   -  person Tim Barrass    schedule 13.07.2012


Ответы (3)


Я как-то разбираюсь. с помощью этого вопроса и ответа

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 с пакетом обновления 1, обновление безопасности MFC

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

person toolchainX    schedule 28.12.2011

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

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

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

person kilian    schedule 06.06.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 будет содержать имя сборки, на которую ссылаются и которую невозможно найти.

person Kevin Smyth    schedule 20.12.2013
comment
Это, добрый сэр, было бесценно! Спасибо, что опубликовали это. - person ForeverLearning; 17.12.2016