代码改变世界

无法注册 msvcr80.dll:An application has made an attempt to load the C runtime library incorrectly

2007-01-16 16:51  晓风残月  阅读(6505)  评论(0编辑  收藏  举报
今天用VC2005写了个Activex,测试部署到其他机器由于目标机器缺少msvcr80.dll和mfc80u.dll,可定是无法运行,然后就想手动注册安装msvcr80.dll和mfc80u.dll,结果两个都弹出一样的错误信息:

baidu 了一下,终于找到一个同样错误网友:http://bbs.pediy.com/showthread.php?threadid=27494
不过,也是从一个德国的牛人解释:
http://blog.kalmbachnet.de/

Using the VC 
2005 shared CRT/MFC (DLL) without a manifest is not supported!
If you build your app with VC2005 and you accidently have disabled the embedding of the manifest file (or deleted the separate appname.exe.manifest file)
, you will get an error on XP and later!

This has to do with the checking for a valid manifest of the EXE inside the CRT/MFC DLLs “DllEntry” (via a call to _check_manifest). If the OS supports manifests (or better Side-By-Side assemblies/DLLs) the CRTs´ DLL forces the check of the EXEs´ manifest. If there is no (valid) manifest
, then the DLL refuses to load (returns 0) and therefor the EXE cannot be started. It might display the following error message (or similar):
R6034
An application has made an attempt to load the C runtime library incorrectly.
Please contact the application’s support team for more information.

But in the following cases the manifest checking inside the CRT-DLL is not done:

Pre-fusion OS (FindActCtxSectionStringW not found in kernel32.dll)
Loaded by instrumented-mscoree.dll (mscoree.dll and pgort80.dll is already loaded)
The path returned with GetModuleFileNameW of the DLL is longer than 
8000 characters
The path to the DLL
, returned by GetLongPathName is longer than 8000 characters 

看来,还是用回VC6,省事一点