问题标签 [msvcrt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
dll - LoadLibrary() 无法使用清单和私有程序集加载 DLL
我正在开发一个使用多个 DLL 的 Windows 应用程序 (EXE)。开发在 VCExpress 2005 (VC 8.0) 中,仅使用 C。
LoadLibrary
其中一些 DLL 是根据 EXE 读取的配置文件 动态加载的插件/附加组件/扩展。
重要的是:应用程序必须是可移植的(即无需安装即可从 USB 闪存驱动器或类似设备运行),并且插件 DLL 可能与应用程序 EXE 不在同一文件夹中(遗留原因)。
使用 MSVC6,这很简单:编译、链接、分发 EXE 和 DLL。
使用 MSVC8,C 运行时库 (MSVCRT) 不再随操作系统分发,因此不能依赖它的安装。为了满足可移植性要求,我需要使用私有程序集。所有的 EXE 和 DLL 都嵌入了它们的清单。
我的问题:通过加载的插件 DLLLoadLibrary()
找不到 EXE 文件夹中的私有程序集,因此除非Microsoft.VC80.CRT
程序集安装在 winSxS 中,否则尝试加载它们会失败。
问题:如果清单从插件 DLL 中删除,一切正常。
我的问题:
在问题案例中,Windows 似乎没有遵循Assembly 搜索顺序或动态链接库搜索顺序。具体来说,它在加载 DLL 的路径中查找私有程序集,而不是从加载应用程序 (EXE) 的路径中。
我试图通过将程序集与 DLL 相邻并更改当前目录(以排除与工作目录相关的情况)来验证这一点,并获得预期的行为。其他人可以确认这是LoadLibrary
与 SxS 一起使用时的正常行为吗?我是否正确假设没有清单,DLL 会退回到在 EXE 的文件夹中找到
msvcr80.dll
(而不是程序集清单)的非 SxS 加载顺序?Microsoft.VC80.CRT.manifest
如果我对 (1) 和 (2) 的看法是正确的,那么仅从 DLL 中排除清单会失去什么?换个说法,为什么我不应该通过排除清单来解决我的问题?
visual-c++ - 运行时库不匹配和 VC++ - 哦,痛苦!
似乎我整个成年生活都被 VC++ 链接器抱怨或犹豫所折磨,因为各种库不同意使用哪个版本的运行时库。我从来没有心情去掌握那个令人沮丧的主题。所以我只是试着弄乱它,直到它起作用。错误消息永远不会有用。微软关于这个主题的文档也不是——至少对我来说不是。
有时它找不到函数 - 因为名称修改不是预期的?有时它拒绝混搭。有时它只是说,“链接:警告 LNK4098:defaultlib 'LIBCMTD' 与使用其他库发生冲突;使用 /NODEFAULTLIB:library” 使用 /NODEFAULTLIB 不起作用,但警告似乎是良性的。到底什么是“DEFAULTLIB”?链接器如何决定?我从来没有见过一种方法来指定链接器使用哪个运行时库,只有如何告诉编译器为哪个库创建函数调用。
有“dependency walker”程序可以检查目标文件以查看它们所依赖的DLL。我刚刚在我正在尝试构建的项目上运行了一个,这真是一团糟。有些系统 .libs 和 .dll 需要冲突的运行时版本。例如,COMCTL32.DLL 想要 MSVCRT.DLL,但我链接的是 MSVCRTD.DLL。我正在搜索是否有 COMCTL32D.DLL,即使在我键入时也是如此。
所以我想我要的是一个关于如何整理这些东西的教程。你做什么,你是怎么做的?
这就是我想我知道的。如果有任何错误,请纠正我。
参数为调试/发布、多线程/单线程和静态/DLL。仅涵盖八种可能组合中的六种。没有单线程 DLL,无论是 Debug 还是 Release。
这些设置只影响链接到哪个运行时库(以及与之链接的调用约定)。例如,如果您正在构建 DLL,则不必使用基于 DLL 的运行时,也不必在构建程序的 Debug 版本时使用 Debug 版本的运行时,尽管在单跳过系统调用。
额外的问题:任何人或任何公司怎么会造成这样的混乱?
c++ - Visual C++ 程序的问题——找不到调试 CRT
我有一个朋友从我那里接手了一个 Visual C++ 项目,但在运行它时遇到了麻烦。它是一个图形应用程序,它使用 Qt GUI 库。我提到这一点的原因是因为下面的错误。
他可以使用 Visual Studio 2010 构建和链接程序,但是当他运行它时,事件查看器中会出现以下消息:
“D:\Test\Qt\4.2.2\bin\QtGuid4.dll”的激活上下文生成失败。依赖程序集 Microsoft.VC80.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b", type="win32", version="8.0.50608.0" 找不到。请使用 sxstrace.exe 进行详细诊断。
当我们按照消息要求执行并运行 sxstrace.exe 时,我们会看到以下内容:
开始激活上下文生成。输入参数:Flags = 0 ProcessorArchitecture = Wow32 CultureFallBacks = en-US;en ManifestPath = D:\Test\Qt\4.2.2\bin\QtGuid4.dll AssemblyDirectory = D:\Test\Qt\4.2.2\bin\
--------------- 信息:解析清单文件 D:\Test\Qt\4.2.2\bin\QtGuid4.dll。信息:清单定义标识为(空)。信息:参考:Microsoft.VC80.DebugCRT,processorArchitecture="x86"type="win32",version="8.0.50608.0" 信息:解析参考 Microsoft.VC80.DebugCRT,processorArchitecture="x86""win32",version=" 8.0.50608.0”。信息:正在解析 ProcessorArchitecture WOW64 的参考。信息:解决文化中性的参考。信息:应用绑定策略。信息:未找到发布者政策。信息:未找到绑定策略重定向。信息:开始装配探测。信息:未在 WinSxS 中找到程序集。信息:尝试在 C:\Windows\assembly\GAC_32\Microsoft.VC80.DebugCRT\8.0.50608.0__1fc8b3b9a1e18e3b\Microsoft 中探测清单。VC80.DebugCRT.DLL。信息:未找到文化中性的清单。信息:末端装配探测。信息:正在解析 ProcessorArchitecture x86 的参考。信息:解决文化中性的参考。信息:应用绑定策略。信息:未找到发布者政策。信息:未找到绑定策略重定向。信息:开始装配探测。信息:未在 WinSxS 中找到程序集。信息:尝试在 C:\Windows\assembly\GAC_32\Microsoft.VC80.DebugCRT\8.0.50608.0__1fc8b3b9a1e18e3b\Microsoft.VC80.DebugCRT.DLL 处探测清单。信息:尝试在 D:\Test\Qt\4.2.2\bin\Microsoft.VC80.DebugCRT.DLL 中探测清单。信息:尝试在 D:\Test\Qt\4.2.2\bin\Microsoft.VC80.DebugCRT.MANIFEST 探测清单。信息:尝试在 D:\Test\Qt\4.2.2\bin\Microsoft.VC80.DebugCRT\Microsoft 处探测清单。VC80.DebugCRT.DLL。信息:尝试在 D:\Test\Qt\4.2.2\bin\Microsoft.VC80.DebugCRT\Microsoft.VC80.DebugCRT.MANIFEST 探测清单。信息:未找到文化中性的清单。信息:末端装配探测。错误:无法解析引用 Microsoft.VC80.DebugCRT、processorArchitecture="x86"、publicKeyToken="1fc8b3b9a1e18e3b"、type="win32"、version="8.0.50608.0"。
很抱歉那条消息的长度,但我认为它可能会唤起一些回忆。这是因为他没有安装 Visual C++ 2005(我相信 VC80 就是从那里来的)C 运行时库吗?如果是这样,他可以下载 VC++ 再分发包并安装它,然后一切都会好起来吗?或者这是一个完全不同的问题?
c - 解决多 CRT 问题
我知道有一些类似的问题,但我不认为他们真的有和我一样的要求。
我们的 DLL 是使用 Visual Studio 2005 编译的,并且由于安装限制,必须与特定版本的 CRT 链接。这是绝对的,用最新版本重新编译它不是解决方案。
我们最近更新了 Boost 库。但是,当我构建 Boost 时,它会自动使用最新的 CRT。现在,当我将 Boost 与我们的程序链接时,它会创建对 CRT 的最新(错误)版本和旧(正确)版本的 CRT 的依赖。对最新版本的依赖需要消失。
这个问题的最佳解决方案是什么?目前,我能想到的最好的方法是使用旧版本重建 Boost,但我不知道如何在不修改源代码的情况下轻松做到这一点。
如果有办法强制 Visual Studio 全局使用特定版本的 CRT(而不是基于每个项目),那就太好了。或者只是简单地删除最新版本的 CRT 的方法,但我很确定这是不可能的,因为我认为它被认为是操作系统的一部分。
c++ - 为什么 MSCVRT 库在链接时会产生冲突?
我正在使用 Visual C++ 2008 构建一个项目,这是一个基于 MFC 的示例应用程序,用于一个静态 C++ 类库,我很快将在我自己的项目中使用。在构建调试配置时,我得到以下信息:
警告 LNK4098:defaultlib 'MSVCRT' 与使用其他库冲突;使用 /NODEFAULTLIB:library
使用推荐的选项后(通过在调试配置的项目链接器设置中的“忽略特定库”字段中添加“msvcrt”),程序链接并运行良好。但是,我想知道为什么会发生这种冲突,为什么我必须忽略一个关键库,如果我以后会出现问题,我是否添加忽略,或者如果我不添加会发生什么(因为程序无论如何都会构建)。
同时,Release 配置警告:
警告 LNK4075:由于 '/OPT:ICF' 规范而忽略 '/EDITANDCONTINUE'
警告 LNK4098:defaultlib 'MSVCRTD' 与使用其他库发生冲突;使用 /NODEFAULTLIB:library
我猜“D”后缀意味着这是 vc++ 运行时的调试版本,不知道这次为什么要使用它。无论如何,将“msvcrtd”添加到忽略字段会导致许多表单的链接错误:
错误 LNK2001:未解析的外部符号 __imp___CrtDbgReportW
任何见解都非常感谢。
windows - 装有 Windows Server 2008 的现成服务器是否包括 VC90 CRT?
Windows Server 2003 的同样问题。
我需要指导人们安装VC 2008 sp1 运行时吗?
答案是否取决于服务器是运行 x64 还是 x86 构建?
VC 运行时是否随 Microsoft Update 或 Windows Update 一起推出?
windows - CRT,我们还需要重新分配吗?
在分发 Windows 原生应用程序时,我们还需要使用 vcredist.exe 吗?这些是否与 Win-7 捆绑在一起?
如果没有,是否有任何技术原因无法通过例如 Windows 更新将这些产品交付给人们——而不是让我们用另一种东西来给客户带来负担。必须工作?(好吧,这听起来可能有争议,但我真的很想知道这些库没有在 Windows 机器上默认安装/更新的原因)
windows - 从使用 msvcr90 到 msvcr80,PATH 环境如何影响我正在运行的可执行文件?
我尝试将各种版本的MSVCR80.dll
文件与生成的可执行文件(通过)放在同一目录下cmake
,但没有一个匹配。
这种问题有通用解决方案吗?
更新
一些答案建议安装VS redist,但我不确定它是否会影响我安装的Visual Studio 9,有人可以确认吗?
可执行文件的清单文件
清单文件似乎说它应该使用MSVCR90
,为什么它总是报告缺失MSVCR80.dll
?
成立
花了几个小时后,我终于发现它是由以下设置引起的PATH
:
删除后一切正常。但是为什么该设置会影响我正在运行的可执行文件从使用msvcr90到msvcr80???
c# - 在 .Net 4 中:PInvokeStackImbalance 异常
我在 .Net 3.5 项目中使用该strlen
功能。msvcrt.dll
进一步来说:
private unsafe static extern int strlen( byte *pByte );
迁移到 .NET 4.0 后,如果我使用此函数,它会引发PInvokeStackImbalance
异常。
如何导入 .NET 3.5msvcrt.dll
或修复此异常?
visual-c++ - 控制 CRT 内存初始化
有时您会遇到仅在发布版本中和/或仅在某些机器上可重现的错误。一个常见的(但绝不是唯一的)原因是未初始化的变量,它们受到随机行为的影响。例如,在大多数机器上,未初始化的 BOOL 大部分时间可能为 TRUE,但随机初始化为 FALSE。
我希望我有一种通过修改 CRT 内存初始化的行为来清除此类错误的系统方法。我很清楚 MS 调试 CRT幻数- 至少我希望有一个触发器将 0xCDCDCDCD(初始化新分配的内存的模式)设置为零。我怀疑即使在调试版本中,也可以通过这种方式轻松消除讨厌的初始化害虫。
我是否缺少启用此功能的可用 CRT 挂钩(API、注册表项等)?有人有其他想法可以到达那里吗?
[编辑:]似乎需要澄清。
- 通常的幻数确实有很多优点,但它们不提供布尔初始化(始终为真)或针对单个位掩码测试的位字段或类似情况的覆盖范围。一致的零初始化(当然,我可以打开和关闭),将添加一层测试,可以显示不良的初始化行为,否则可能很少见。
- 我当然知道CrtSetAllocHook。这样设置的钩子不会接收到分配缓冲区的指针(在分配缓冲区之前调用它),所以它不能覆盖它。重载全局 new 也没有多大好处,因为它会覆盖任何有效的构造函数初始化。
[编辑:] @Michael,不确定覆盖 new 是什么意思。简单的代码,如 -
行不通。粘贴和修改整个 ::new 代码可能会起作用,但看起来有点吓人(上帝只知道我必须#include 和链接才能让它运行)。