问题标签 [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.

0 投票
9 回答
29393 浏览

visual-studio-2005 - vcredist_x86.dll 和版本 8.0.50727.4053

我在我的系统上构建的 Visual C++ 2005 使用 CRT DLL 版本 8.0.50727.4053。我相信它是最新的,并且由 Windows 自动更新。

在用户系统上,找不到此版本的 DLL。我过去曾使用 vcredist_x86.exe 作为安装程序的一部分来安装运行时 DLL。它曾经工作过。

我的问题是,即使是最新版本的 vcredist_x86.exe(Microsoft Visual C++ 2005 SP1 Redistributable Package (x86))也没有安装这个版本的 DLL。

那么我需要哪个 vcredist_x86.exe 文件呢?

PS 强制我的应用程序链接到特定版本的 CRT 会解决问题吗?它是一种首选方法吗?

谢谢,

保罗

更新:还有其他人观察到 vcredist_x86.exe(Microsoft Visual C++ 2005 SP1 Redistributable Package (x86))没有安装 8.0.50727.4053。

UPDATE2:至少有人建议强制使用以前版本的 CRT ( http://tedwvc.wordpress.com/ )。然而,这会给我们的项目增加很大的复杂性。

0 投票
2 回答
3272 浏览

.net - 使用 Tessnet2 的 .NET 应用程序失败

我有一个使用Tessnet2的应用程序。当我尝试调用其 Init 方法时,应用程序失败。
失败太可怕了——没有例外(ANY),没有任何错误痕迹,甚至没有“发送报告”窗口。该应用程序的进程刚刚删除

有问题的代码是:

几个可能有用的注释:

  • Tessnet2 需要Visual C++ 2008 运行时。不确定它是否应该是 msvcm90.dll、msvcm80.dll。
  • 该应用程序是桌面 WPF。
  • 开发环境:VS 2008 SP、.NET 3.5 SP1
  • 它以前工作过(我想我添加了 Web 引用来使用 SOAP Web 服务,但我试图删除它但没有结果)。
  • 单元测试运行良好,没有失败

从这些观察来看,这听起来像是 WPF 应用程序本身的问题。

我只有一条信息是调试期间的输出:

应用程序失败时的最后一块:

更新:我检查了事件日志。没有任何带有“SideBySide”来源的条目。下面只有与该问题相关的条目,但不幸的是它并没有告诉我很多信息:

提前感谢您的任何提示。

0 投票
2 回答
17264 浏览

windows - 如何在 Visual C++ 运行时禁用缓冲区溢出检查?

我和其他几千人收到 Microsoft Visual C++ 运行时抛出的错误:

替代文字

为了搜索引擎的利益,说:

现在我明白了缓冲区溢出是什么,以及为什么它是一件坏事。鉴于微软新强调“它刚刚坏了”, MSVCRT中的额外缓冲区检查可能是一件好事。

另一方面,我不在乎。不是程序不能继续,而是程序不能安全地继续。好吧,我宁愿不安全,因为它总比没有好。我喜欢危险地生活。

那么任何人都可以提出任何建议吗?我在想这样的事情:

  • 防止 MSVCRT 停止执行的注册表项
  • 在与以前的操作系统(Windows 7 之前)兼容的情况下运行应用程序
  • 将程序集清单添加到可执行文件夹,以便它使用旧版本的 MSVCRT,它不执行此溢出检查
  • 没有溢出检查的 MSVCRT 副本的版本号或下载位置

我尝试搜索编写Microsoft Visual C++ 运行时库的公司的支持站点,但他们没有提及哪些函数可能溢出,或者如何禁用溢出检查。

0 投票
3 回答
2880 浏览

c++ - 静态链接使用不同版本的 C 运行时库构建的库,好还是坏?

考虑这种情况:应用程序链接到第 3 方库 A。

A 是使用 MSVC 2008 构建的,并且静态链接(即使用 /MT 构建)到 C 运行时库 v9.0。

该应用程序是使用 MSVC 2005 构建的,并且静态链接到 A 和(使用 /MT)到 C 运行时库 v8.0。

我可以看到这个问题 - 例如,如果运行时库版本之间的标头中的类型发生了变化。

是否注意保持运行时库标头在版本之间兼容,或者是否应该始终确保所有静态链接的库都链接到相同版本的运行时库?

0 投票
2 回答
1115 浏览

c++ - msvcrt.dll 是否为其 rand() 函数使用线性同余生成器?

我试图预测一个程序的输出,该程序使用 msvcrt 的 rand() 函数来生成三个骰子的面。我相信代码类似于: dice[0] = rand() % 6 + 1; dice[1] = rand() % 6 + 1; dice[2] = rand() % 6 + 1;,我想知道是否可以使用线性同余生成器的预测程序来预测序列中的下一个数字。

0 投票
4 回答
4014 浏览

c++ - 如何找到此链接器错误的原因?

经过漫长的重命名项目后,我的 DLL 项目将不会在调试模式下构建(发布构建工作):

该项目及其所依赖的五个静态库被设置为使用“多线程调试 (/MTd)”(在 C/C++|代码生成|运行时库下)。我相信 LIBCMTD.lib 是用于多线程调试的,但什么是 MSVCRTD.lib,什么可能导致此错误?

如果它有所作为,这个 DLL 是用于 Windows CE 的。

0 投票
2 回答
1034 浏览

linker - How to build MTd projects which use MDd dlls in VS2005

I am building my application in Visual Studio 2005, using project properties ->c/c++->CodeGeneration->RuntimeLib: MTd (using static CRT library-LIBCMTD). The application is using 3rd party dlls and libs which are built in MDd(using dynamic CRT lib- MSVCRTD).

I'm getting linker errors as: MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __mktime64 already defined in LIBCMTD.lib(mktime64.obj) MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __gmtime64 already defined in LIBCMTD.lib(gmtime64.obj) MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __localtime64 already defined in LIBCMTD.lib(loctim64.obj)

I cannot change the 3rd party settings. My application runs fine if I use the CRT lib dynamically, but I cannot change this.

Thanks

0 投票
1 回答
1627 浏览

visual-studio-2005 - StaticCRT(LIBCMT(D)) 和 DynamicCRT(MSVCRT(D)) 冲突

我正在开发一个使用第三方 dll 和库的项目。我想使用静态 CRT (LIBCMTD) 构建我的项目,因为我希望在“IBM purifier”中运行我的应用程序。但是,第三方库是使用动态 CRT(MSVCRT) 构建的。

这给出了链接错误: MSVCRTD.lib(MSVCR80D.dll) : 错误 LNK2005: __mktime64 已在 LIBCMTD.lib(mktime64.obj) 中定义 MSVCRTD.lib(MSVCR80D.dll) : 错误 LNK2005: __gmtime64 已在 LIBCMTD.lib 中定义( gmtime64.obj) MSVCRTD.lib(MSVCR80D.dll) : 错误 LNK2005: __localtime64 已在 LIBCMTD.lib(loctim64.obj) 中定义

我尝试了各种链接器设置。我还给链接器命令行提供了 /FORCE:MULTIPLE 以忽略多个定义并创建一个构建。它这样做了,但我的应用程序仍然无法在净化器中运行。

有没有一种好方法可以做我想要实现的目标?我无法控制第 3 方源代码来控制他们的设置。

谢谢

0 投票
1 回答
1302 浏览

msvcrt - 私有非托管并排装配问题

我们有一个使用大量 DLL 的大型 MFC 应用程序。到目前为止,我们一直在使用 vcredist_x86.exe 将 MFC 和 CRT 安装到非托管并行程序集缓存 (C:\Windows\WinSxS) 中。当以这种方式安装 MFC/CRT 时,应用程序会运行(在干净的 XP 机器上)。

根据 MSDN 文档,您可以通过将程序集文件复制到安装应用程序的文件夹中来安装 MFC/CRT。我已经用一个简单的 MFC 应用程序对此进行了测试,它可以工作。但是我在让我们的大型 MFC 应用程序使用这种方法工作时遇到了问题。

问题似乎是由于某些 DLL 的清单引用了早期版本的 CRT,例如,一个 DLL 包含以下清单。

我们将 CRT 程序集的 8.0.50727.762 版本复制到我们应用程序的文件夹中。如您所见,这是 CRT 的较新版本。但由于某种原因,操作系统加载程序无法使用上述清单加载 DLL。在 WinSxS 中安装相同的 CRT 程序集时不会发生这种情况。当我使用 DependencyWalker 跟踪加载时,我收到错误 LDR: LdrpWalkImportDescriptor() failed to probe c:\documents and settings\qatest\desktop\test\log4cpp.dll 的清单,ntstatus 0xc0150002

加载程序加载较新版本的程序集的能力似乎在使用私有并排程序集时不起作用,但在将程序集安装到 WinSxS 时它确实起作用。

有针对这个的解决方法吗?

0 投票
2 回答
6060 浏览

memory-leaks - 为什么 _CrtSetBreakAlloc 不会导致断点?

我正在使用 Visual CRT 的内存泄漏检测例程<crtdbg.h>;当我调用_CrtDumpMemoryLeaks一个分配时,程序的每次调用都会一致地报告:

地址不同,但{133}始终相同。

根据 MSDN 关于How to set breakpoints on memory allocation number的说明,我应该能够通过此调用在第 133 个分配上设置断点:

而且我还可以在监视窗口中验证{,,msvcr90d.dll}_crtBreakAlloc确实设置为 133。程序退出后,泄漏报告仍然列出 #133(以及一些更高的数字),但没有出现断点。为什么会这样?如何让断点发生?

潜在相关信息:

  1. VS2008,使用“多线程调试DLL”CRT
  2. 我的代码是由第三方产品加载的 DLL
  3. “正常”断点工作得很好;逐步完成工作正常;__asm int 3工作也很好。
  4. 也没有其他值_crtBreakAlloc导致断点(不是我尝试过的那些)
  5. #133 是泄漏报告中的最低数字