问题标签 [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.
c++ - CRT 和 C++ 软件
我不明白为什么在构建 c++ 软件时需要链接到 C 运行时库中?是因为标准 c++ 库使用它吗?
c++ - __time32_t 时间精度?
我正在使用一个 api,它使用两个 __time32_t 对象打开数据库的游标,指定查询的开始和结束时间。
__time32_t 是否具有亚秒(毫秒)时间精度?MSDN有点不清楚。
我拥有的 time32_t 对象是这样做的:
我希望给我 currentET 内的时间减去 10 毫秒,但它所做的只是减去一整秒,就好像我这样做了:
我怎样才能将这种精度恢复到 time32_t 对象中?
c++ - 发现问题:Visual Studio CRT 库:FLS_GETVALUE
今天查看Visual Studio 2008和2010的CRT库的源代码,发现mtdll.h文件有bug。问题出在宏 FLS_GETVALUE 上。在 x86 系统上,此宏直接调用 TlsGetValue,而不是调用分配给变量 gpFlsGetValue 的函数。
首先,这是一个问题,因为 FlsAlloc、FlsGetValue、FlsFree 和 FlsSetValue 并非在所有系统(Windows Vista+ 和 Windows Server 2003+)上都可用。这些函数的行为类似于 TlsAlloc、TlsGetValue、TlsFree 和 TlsSetValue,但支持 Fibers(一种用户线程)。因为我们应该更喜欢使用 Fls* 函数而不是 Tls 函数,所以 VS 的 C 运行时库会在加载进程或 dll 时检查 Fls 函数是否可用,并初始化 gpFls* 变量。如果 Fls* 不可用,CRT 将使用等效的 Tls* 函数初始化这些变量。
您不能在代码中直接使用宏 FLS_GETVALUE,因为它在运行时库内部使用。运行时使用此宏来初始化运行时库的每个线程数据。
我的问题是关于这个错误的影响。我知道 Fiber 并没有被广泛使用,但是如果您开发一个在使用 Fiber 的应用程序中使用的 DLL,会产生什么影响?这个错误是否会导致应用程序崩溃或只会产生错误的结果?这个问题是否会导致 SQL Server 等广泛使用的应用程序出现问题?你怎么看?这个错误会带来安全风险吗?IIS 或 ASP.Net 是否使用可能导致崩溃的光纤?
对于好奇的人,这里是 mtdll.h 中问题行的当前来源:
#define FLS_GETVALUE ((PFLS_GETVALUE_FUNCTION)TlsGetValue(__getvalueindex))
这里是宏 FLS_GETVALUE 的固定版本:
#define FLS_GETVALUE (((PFLS_GETVALUE_FUNCTION)DecodePointer(gpFlsGetValue))(__getvalueindex))
现在,我应该找到如何向 Microsoft 提交错误。
msvcrt - 在 Vista (SP2) 64 位上:为什么我的 C/C++ 运行时 (CRT) 程序集缓存对我的应用程序不可见?
嗨,所有 VC++ 和 Windows 专家!;)
首先,我的背景:Vstudio、C & C++、Windows。(如果你愿意,你可以和我一起学习技术)。经过 5 天尝试各种可能性、论坛和修复甚至更改操作系统平台后,我决定在这里发帖(或跳出窗口!)我在 AGONy 试图解决这个问题,因为它是阻止我的实际开发工作!!. :)
Soo.. sceratio 是:出现问题的开发机器:操作系统:带有 SP2 的 Windows Vista 64 位(即使在使用 VMWare 运行的 32 位 XP SP2 虚拟机上发生相同的问题。开发 IDE:带有 SP1 的 Visual Studio 2008已安装。输出二进制类型:.DLL(它的命运是成为一个开发插件。IDE caled RealStudio)
问题/问题:我正在使用 VStudio 2008 开发一个 32 位 C++ DLL。它包含一个相当大的 C++ 库,称为 ASDCP(用于音频/视频编解码器处理)——它是用 PURE C++ 编写的,并且具有完整的内置支持在 Win32、Linux、MacOS 等上构建。
现在 ASDCP 库使用 C++ 标准库(存储在 MSVCP90.dll 和 .lib 文件中)。因此,当我构建自己的插件(DLL)并允许它是调用者应用程序(称为 RealStudio,另一个开发 IDE)时,没有 ASCP 库(因此不需要链接 C++ Std.Libs),它工作正常. 但是当我从 ASDCP 库添加代码,并选择静态链接(/MT)C++ 运行时库,然后加载插件并运行 RealStudio 时,它会因内存泄漏而崩溃——可能是“访问冲突”——可能是由各种 DLL 之间的一些不匹配引起的。
现在,我对这篇文章的问题是,当我在 VStudio 2008 中动态链接 CRT,然后尝试通过 rnnign RealStudio 加载插件时——该死的东西根本无法找到 Microsoft.CRT 的 Side-by-Size ASSEMBLY CACHE .VC90!!我已经处理了所有清单文件,将清单文件嵌入到 DLL 中,检查(大约 10 次!)WinSxs 程序集缓存中的 CRT 版本,反对我的清单文件/依赖项需求。
但不知何故...... RealStudio(RunAs Admiistrator)无法加载我的 CRT 9 DLL(特别是 MSVCP90.dll)。我在 MSDN 和其他论坛上花了大约 15 个小时来查看类似的问题和解决方案,并按照微软论坛版主的建议实施了这些解决方案。但无济于事。
所以..你如何获得一个在 64-Windows(Vista SP2)下运行的 32 位 C++ DLL,以“查看”相关 CRT 依赖项的 Assembl 缓存并加载它??????
帮助!?!?!拜托了。。
提前深深感谢帮助我恢复理智!
迪内什
c++ - 如何在另一个 CRT 库中重新路由 std::clog?
我有一个用 VS2008 构建的 Win32 程序,所以我的代码与 MSVCR90.DLL 和 MSVCP90.DLL 链接。但是,它也在使用 VS2005 构建的 DLL(我无法修改)中运行代码,并且当该 DLL 中的代码打印到阻塞流时,它通过 MSVCR80.DLL 和 MSVCP80.DLL 执行此操作。这就是问题所在:如果我在代码中重新路由 std::clog,我只会影响针对 crt 9.0 库构建的代码,使用旧 crt 8.0 的代码不会重新路由其输出。那么有没有办法在针对旧 CRT 构建的 DLL 中重新路由阻塞流?
我调查了在较旧的 CRT DLL 上调用 GetModuleHandle() 和 GetProcAddress() 并设法重新路由 C stderr 流(通过 _open_osfhandle 和 _dup2),但是 C++ 阻塞流似乎仍然不受影响。我想我还需要在旧的 CRT 库中调用 ios_base::sync_with_stdio() 但我无法获得该函数的有效地址。任何帮助将不胜感激。
谢谢。
c++ - CRT 在 VS 2008 中调用 _osfile() 时出现断言错误?
我有一个已经工作了很长时间的 C++ 代码库。代码库是我最近迁移到 VS 2008 的遗留 VS 2003 项目集。迁移似乎是成功的,因为生成的程序已构建并运行。
我在新驱动器上重新安装了我的操作系统和所有应用程序,现在当我尝试在调试器中调试程序时,我在 CRT 中收到一个断言错误chsize
(真的,_chsize_s
)。具体来说(裁剪为必需品,忽略安全检查):
调试断言发生在chsize
- 特别是在 CRT 的源代码文件 chsize.c 的以下行中:
...filedes
匹配的地方filehandle
。
我认为问题可能是由于新系统上没有安装旧版本的 VS(仅限 VS 2008),因为一些第 3 方库需要 VS 8.0 可再发行版 - 即使在旧系统上似乎正在构建和运行使用 VS 2008 就好了。因此我安装了 VS 2005(不是 2003)。但是,问题仍在继续发生。
任何建议都会非常受欢迎。
*更新 - 该问题与chsize
. 请看下面我的回答。
c - suppress or intercept CRT checks from instances of CRT from other dlls
My program loads several dlls and calls their functions. The dlls can use different versions of CRT.
When C runtime checks the validity of arguments and finds problems, it calls the invalid parameter handle, which in turn, closes the application, with or without the "Send-Don't send" dialog.
I tried calling *_set_invalid_parameter_handler* but it only works if it is called from within the bad dll. I tried SetErrorMode, but all I managed to do is get the process killed without the dialog.
Is there any way to handle those exceptions? I don't care if some resources are compromised. All I want is to allow users to save the configuration. If the dialog appears, they click on it and kill the process.
EDIT It turns out the solution to load all versions of CRT or to enumerate all DLLs fails. To make all clear, here is a small example to play with:
This would be my main application (let's call the file application.c):
This application loads a dll that does bad things (it is not developed by me, so I will not accept any solution telling me to fix the bugs there). Lets' call that file extension.c.
To compile, do:
The question is what do I do in function fixMyProblem(), so that I don't get the send/don't send dialog on XP or the application has stopped working dialog on 7.
According to David Gladfelter I should do
and also do this for each version CRT available. It turns out that even with one single version of CRT (I use the same for both exe and dll), it still does not work. They both use the same version of CRT, but is seems they do not use the same CRT.
If this is is the case, I assume that the stuff I have to change is inside the DLL. Of course, it does not export *_set_invalid_parameter_handler*.
But to be fair to David Heffernan, here is the implementation for his solution:
For my real application, not this test, I get 1 dll fixed (msvcp90.dll). It still does not fix my problem.
I would appreciate any help in solving this.
ssl - 生成并提交 csr 后,我可以删除 ssl 密钥上的密码吗?
我想删除生成的 SSL 密钥上的 SSL 密码,但我已经从密码密钥生成了 CSR。如果我删除密码,是否需要再次重新生成 CSR,或者 crt 是否可以使用未通过密码的密钥正常工作?
c++ - 如何初始化 c-strings 数组(无 stl)
我想在 MSVC2010 中用零指针初始化 c 字符串数组
如何正确初始化arr_
?我不允许使用 STL、MFC 等。
windows - 在 Windows 中将日期转换为区域设置的字符串
这可能是一个简单的,但我似乎无法找到一个简单的解决方案。我需要将日期格式化为字符串,以便以完整的语言环境形式表示。例子:
2011 年 5 月 28 日(美国地区)
_strftime_l(_T("%#x")) 可以做类似的事情,但它会预先增加一个工作日,我不需要。