问题标签 [crt]

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 投票
3 回答
573 浏览

windows - 使用 Window CRT 检测生成进程的死亡

执行摘要:我需要一种方法来确定我通过 _spawnl 生成并正在使用 _pipe 中的 FD 进行通信的 Windows 进程是否已经死亡。

细节:

我正在使用 Windows 中的低级 CRT 函数(_eof,_read)与通过调用 _spawnl(使用 P_NOWAIT)标志生成的进程进行通信。我正在使用 _pipe 创建文件描述符以与这个生成的进程进行通信,并在命令行上将这些描述符(FD #)传递给它。

值得一提的是,我不控制生成的过程。对我来说这是一个黑匣子。

事实证明,我们生成的进程偶尔会崩溃。我试图通过检测崩溃来使我的代码对此具有健壮性。不幸的是,我看不到这样做的方法。在我看来,如果进程终止,对其中一个描述符的 _eof 或 _read 调用将返回错误状态 (-1),这似乎是合理的。

不幸的是,事实并非如此。描述符似乎有自己的生命,独立于生成的进程。因此,即使另一端的进程已经死了,我用来与之通信的文件描述符上也没有错误状态。

我已经获得了嵌套进程的 PID(从 _spanwnl 调用返回),但我没有看到任何可以用它做的事情。我的代码运行良好,除了一件事。我无法检测到生成的进程是否只是忙于计算我的答案或已经死亡。

如果我可以使用来自 _pipe 和 _spawnl 的信息来确定生成的进程是否已死,我会很高兴。

非常欢迎提出建议。

提前致谢。

更新:我找到了一个相当简单的解决方案并将其添加为选定的答案。

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 投票
3 回答
2388 浏览

c++ - 分发 VC++ 运行时文件的正确方法

我有一个 MFC 应用程序,我正在尝试打包以进行部署。它似乎取决于文件“msvcr90.dll”、“msvcp90.dll”和“mfc90.dll”。分发这些文件的正确方法是什么?

我不能使用合并模块,因为我的安装程序不支持它们。我知道我可以运行 VCRedist_x86.exe,但出于各种原因我不想这样做。

据我所知,我唯一的选择是将文件安装为 Private Side-by-Side 程序集。这个对吗?

根据http://msdn.microsoft.com/en-us/library/ms235317(VS.80).aspx安装私有程序集的正确方法是复制“Microsoft.VC90.CRT”和“Microsoft.VC90” .MFC' 文件夹与可执行文件位于同一文件夹中。这是解决问题的正确方法吗?它可以工作,但以这种方式复制系统文件似乎有点 1990 年代。谁能给我看一个这样做的另一个应用程序(或至少一个演示项目)的例子?

最后,我什么时候需要担心为我的应用程序分发 .manifest 文件?我应该显式安装 XML 文件,还是以某种方式嵌入到我的可执行文件中?

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 回答
97 浏览

visual-studio-2008 - Does anybody know any troubles with deploying Visual C++ library using XCopy?

We need to deploy Visual C++ library. We have tried deploy this libraries using Merge Modules, but uninstall became too slow (about 10-20 minutes). So we've decided to deploy this libraries using XCopy method. Does anybody know any troubles with deploying Visual C++ library using XCopy?

0 投票
2 回答
2100 浏览

windows-server-2008 - 为什么在 Windows Server 2008 x64 上重命名 reg.exe 会导致它无法运行?

我有一个很好的问题。

有一个名为 reg.exe 的实用程序随 Windows 一起提供了相当长的一段时间。从脚本导入 .reg 文件、从脚本修改值等非常方便。因此,在为脚本场景制作副本时(“为什么不在 system32 中使用副本?”-> 软件限制策略,个人偏好)等)我注意到重命名它会使其静默失败:

Windows 服务器 2008 x64:

但是对于 Windows XP x86:

WinDbg 似乎告诉我 CRT 正在杀死它:

但是由于我对 WinDbg 不太熟悉(而且这个是 64 位的,所以说,Ollydbg 失败了)我在这里有点不知所措。感谢你们提供的任何信息。

编辑

感谢 Cyber​​Shadow 的帮助和一些谷歌搜索,我找到了解决方案:它在当前安装的语言的子文件夹中查找 .mui(它的翻译)。

0 投票
1 回答
830 浏览

static - 帮助死锁分析

当局部静态变量的初始化发生在使用参数 DLL_THREAD_DETACH 从 DLLMain 入口点调用的函数中时,我的应用程序中就会发生死锁。

下面是Windbg分析

这通常是由另一个持有加载程序锁的线程引起的。

以下是持有的锁。

CritSec ntdll!LdrpLoaderLock+0 at 7c97e178

锁数 3

递归计数 1

拥有线程 17e8

EntryCount d

争用计数 d

*** 锁定

CritSec MSVCR80!__app_type+94 at 781c3bc8

锁定计数 1

递归计数 1

拥有线程 1100

条目数 1

ContentionCount 1 *** 锁定

#

调用堆栈线程 17e8

781c3bc8 78132bd9 0777fde4 ntdll!RtlEnterCriticalSection+0x46

00000008 b87d2630 00000000 MSVCR80!_lock+0x2e

0864ae10 08631d7f 0864ae10 EPComUtilities32!_onexit+0x36

0864ae10 b87d2588 00000001 EPComUtilities32!atexit+0x9

0777fea8 0864719f 08630000 EPComUtilities32!XCriticalSectionEx::ThreadTerminated+0x5f

08630000 00000003 00000000 EPComUtilities32!DllMain+0x20

08630000 7c90118a 08630000 EPComUtilities32!__DllMainCRTStartup+0x7a

08630000 00000003 00000000 EPComUtilities32!_DllMainCRTStartup+0x1d

#

调用堆栈线程 1100

000000b0 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc

000000b0 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xa8

000000b0 ffffffff 06ce64e0 kernel32!WaitForSingleObject+0x12

000480ba 000f4240 00000000 CATSysMultiThreading!CATThreads::Join+0xf5

0012fcc8 00000004 00000000 JS0GROUP!CATLM::StopHB+0xf4

d138509f 00416694 00000001 JS0GROUP!CATLM::Unmake+0x6b

00000000 00000000 00000000 MSVCR80!_cinit+0xd6

00000000 0012fd6c 081e68d9 MSVCR80!exit+0xd

00000000 06d404f0 0998fb90 JS0GROUP!CATExit+0x1d

00000000 004ef366 0000000d DNBPLMProvider!DNBEPLMTransactionMgt::OnApplicationExit+0x229

00000000 0012fd9c 004eabfc JS0GROUP!CATCallExits+0x2bc

00000000 0012ff7c 0040cefd JS0GROUP!CATErrorNormalEnd+0x31 00000000 06ce71d0 06ce71d0 JS0GROUP!CATExit+0xc

00000007 06cdb120 059b61d8 DLMMfgContextSolver!main+0x146d

ffffffff ffffffff bffde000 DLMMfgContextSolver!__tmainCRTStartup+0x10f

#

请给您评论以了解可能导致死锁的原因。注意:当我将静态变量设为非静态时,问题在论坛中发布的示例上下文中消失了死锁发生在函数作用域静态变量中(VC++ 中的线程不安全)

0 投票
3 回答
499 浏览

c++ - 如何在不使用 CRT 的情况下将双精度数转换为字符串

我的问题没有实际应用。我只是感兴趣。假设,我有一个双精度值,我想获得它的字符串表示,类似于printf函数。如果没有 C 运行时库,我将如何做到这一点?假设我使用的是 x86 架构。

0 投票
2 回答
517 浏览

solaris - solaris 7 上的运行时库 crti.o 在哪里?

我知道 Solaris 10 上的 /usr/lib 中存在 crti.o crt1.o crtn.o。但这些文件在 Solaris 7 上不存在。

0 投票
1 回答
578 浏览

visual-studio-2008 - Windows 更新会破坏 dll?

我正在编译一个使用多个 DLL 并使用 VS2008 编译的项目。最近在我的计算机上编译的 Windows 更新 DLL 停止在其他计算机上工作。

经过一番调查,结果发现它将我正在编译的 CRT 可再发行库从版本“9.0.21022.8”更新到版本“9.0.30729.4148”

从我正在编译的 EXE 的清单文件中可以看出这一点。它包含以下内容:

这意味着它想同时使用两个不同版本的 CRT。我现在正在编译的代码需要第二个版本,而几周前编译的旧 dll 需要第一个版本。

在部署应用程序的计算机中,这成为一个问题,因为它们从名为Microsoft.VC90.CRT而不是从 WinSXS 的本地文件夹中获取 CRT dll。此文件夹不能包含两个不同版本的 dll。

这个问题是否有已知的解决方案,或者我是否需要开始使用新的 CRT 编译所有其他 DLL?