问题标签 [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++ - 如何为 _beginthreadex 提供 64 位线程标识符
我正在尝试将一些代码移植到 64 位,但似乎其中的线程地址标识符_beginthreadex
是unsigned int
32 位,我无法从函数传递/接收 64 位地址标识符:
我查看了MSDN 文档,但没有看到该功能的 64 位版本。我是否包括了错误的标头、每个处理器的标志,或者是否有其他方法可以创建具有 64 位地址标识符的线程?
更新
文档说明该thrdaddr
参数是 32 位的:
阈值
windows - Windows 帐户之间的不同运行时
我在某些计算机上运行 Windows 服务时遇到问题,而不是全部。
它由VS2008编写,需要VC Runtime。我先安装了 VC Runtime,然后由管理员安装了服务。
服务登录用户是管理员组中的 liwb。然后我发现该服务无法在某些计算机上运行。他们都有用户 liwb 并且密码是正确的。
然后我将服务的登录用户更改为 SYSTEM,但它仍然存在。
最后,我将服务的登录用户更改为管理员。有效。
那么,有什么不同呢?
该服务在主函数中有日志,但失败时日志文件中没有任何内容。所以,我想当我使用 liwb 或 SYSTEM 来运行服务时,它找不到 VC Runtime。而且我认为 liwb、SYSTEM 和 Administrator 有不同的运行时。
但我不知道为什么?有没有关于这个问题的资源?
certificate - 如何使用 GoDaddy 证书在 AppHarbor 中创建证书
我从 GoDaddy 购买了通配符证书,我想将此证书与 AppHarbor 上的网站相关联。
AppHarbor 只允许我上传 PFX 证书。那么,如何将 .CRT 转换为 .PFX?
c - _invalid_parameter 在发布版本中没有得到有用的信息
当 CRT 函数获取无效参数时,我正在使用 _set_invalid_parameter_handler 覆盖程序的默认行为,该参数会因 0xc0000417 (STATUS_INVALID_CRUNTIME_PARAMETER) 而崩溃。
这是我的处理程序:
我想记录信息并发送错误报告。在 Debug 构建中,我得到了有用的参数信息,但在 Release 构建中,所有参数都是 NULL,这不是很有用。有没有办法在发布版本中添加有用的信息?
visual-studio - 如何在我的项目中正确构建用于调试和发布配置的第三方库?
当我需要构建一些第三方库以在不同版本的 MSVC 下的多个项目中使用时,我通常为每个MSVC 版本以及调试和发布配置构建它。这就是 boost 所做的,这就是我们在团队中的整个一生都在做的事情。
但是,我仍然不明白,为什么我不能用 like... 来构建这个库。我只需要函数原型和目标代码,对吗?由于我静态链接 CRT,我没有外部依赖项。但是,当我尝试将在 MSVC8 下的 Release 中构建的库与我在 MSVC10 下的 Debug 中的项目链接时,我遇到了这个令人讨厌的“已定义”链接器错误,我们都非常讨厌。
但为什么?我可以在 lib 中“封装”所有这些函数而不导出它们,以便我的项目只从 lib 中获取它需要的东西吗?为什么我可以拥有可以在每个项目中链接的 libpng 和 zlib 的预编译版本?是的,我猜它们不是使用 MSVC 构建的,但仍然使用 CRT 的相同功能。那么任何人都可以深入解释或分享对这个问题的一些开明解释的链接吗?
c++ - 为什么 /MD 是编译器的选项?不是链接器的?
可能重复:
为什么运行时库是编译器选项而不是链接器选项?
我不明白为什么我必须在编译阶段选择 RTL 类型?
例如,我创建了一个带有选项 /MD 的静态库 A.lib。然后我用选项 /MT 创建了第二个静态库 B.lib。
当我尝试将 A.lib 和 B.lib 链接到我的 C.exe 时,我会收到链接器错误。
但是在编译阶段(创建 A.lib 和 B.lib)没有任何理由从 c 或 c++ 运行时解析符号。
c - 关于 vsnprintf(采访)
在一次采访中,我被要求(除其他外)实现以下功能:
类似于sprintf
,除了不是已经分配的存储,函数必须自己分配它,并在*psz
变量中返回。此外,*psz
可能指向一个已经分配的字符串(在堆上),它可能会在格式化期间使用。自然,该字符串必须通过适当的方式释放。
返回值应该是新创建的字符串的长度,或者错误时为负值。
这是我的实现:
问题作者声称此实现存在错误。不仅仅是在特定深奥系统上可能失败的标准违规,而是一个“真正的”错误,它可能在大多数系统上偶然失败。
它也与使用 ofint
而不是适合内存能力的类型无关,例如size_t
or ptrdiff_t
。说,字符串的大小是“合理的”。
我真的不知道这个错误可能是什么。恕我直言,所有指针算术都可以。我什至不认为两个后续调用会vsnprintf
产生相同的结果。恕我直言,所有可变参数处理的东西也是正确的。va_copy
不需要(这是使用 的被调用者的责任va_list
)。也在x86上va_copy
并且va_end
没有意义。
如果有人能发现(潜在的)错误,我将不胜感激。
编辑:
查看答案和评论后 - 我想添加一些注释:
- 自然地,我已经使用各种输入构建并运行了代码,包括在调试器中一步一步地观察变量状态。如果不先亲自尝试,我永远不会寻求帮助。我没有看到任何问题,没有堆栈/堆损坏等。我还在调试版本中运行它,启用了调试堆(它不能容忍堆损坏)。
- 我假设函数是使用有效参数调用的,即
psz
是一个有效的指针(不要与 混淆*psz
),szFmt
是一个有效的格式说明符,并且所有可变参数都被评估并对应于格式字符串。 - 根据标准,
free
用指针调用是可以的。NULL
vsnprintf
使用NULL
指针和大小 = 0可以调用。它应该返回结果字符串长度。MS 版本虽然不完全符合标准,但在这种特定情况下也是如此。vsnprintf
不会超过指定的缓冲区大小,包括 0 终止符。意味着 - 它并不总是放置它。- 请把编码风格放在一边(如果你不喜欢它——我很好)。
c++ - 与 Microsoft 相比,Linux CRunTime 库如何处理
我在使用 Microsoft 的 CRT 时遇到了很多概念问题。对于任何项目,您必须编译所有必需的库以链接到相同版本的 CRT。
第一个问题是当您的项目静态链接到 CRT (/MT) 时。然后所有依赖库也必须静态链接自己的 CRT。所以每个库都有自己的版本——例如——malloc()。如果您去年在系统 A 上编译了其中一个库,则该 CRT 版本可能与您当前在另一个带有 Service Pack 3+ 的系统 B 上使用的版本不同。因此,如果您要释放由库分配的对象,您可能会遇到问题。
所以看起来动态链接的 CRT 是要走的路(/MD)。使用 dll,所有库都将获得系统上 CRT 的当前实现。除了 Microsoft 的 Side by Side 机制之外,情况并非如此。相反,您会获得在您编译的库上标记的 CRT 版本,并且该版本的 DLL 将提供给该库。因此,可能会发生与我之前描述的完全相同的问题。您在一年前针对一个 CRT 在系统 A 上编译了一个库。一年后有一个升级的新版本。您的主程序使用一个版本的 CRT 获取 DLL,该库使用另一个版本的 CRT 获取 DLL,可能会出现同样的问题。
所以你会怎么做?我意识到跨库内存分配是不受欢迎的。但是您可以忽略 malloc 示例并提出另一个示例。您是否让每个开发人员在他们的机器上重新编译每个依赖库以确保所有内容都使用相同的 CRT?然后对于发布你重新编译每个库?
这在 Linux 上是如何工作的?这是我的主要兴趣。是否有 GCC 提供的 CRT 或 Linux 系统本身带有 CRT 库?我从未在 Makefils 中看到过明确链接的 CRT。
在 Linux 上,动态库链接到什么 CRT?机器上最新的一个,还是更“并排”的机制。
c - CRT 与共享库和应用程序的链接
Windows 应用程序动态链接 CRT。在应用程序执行其部分代码后,它会加载共享库。共享库与 CRT 静态链接。
我的问题是:
如果应用程序对“CRT 状态”进行了一些更改(例如在某个文件中重新打开标准输出),这些更改对 dll 代码是否有效?
谢谢
c++ - atlbase.h 和不同版本的 VC CRT
我有一个使用 Visual Studio 2010 创建的 C++/CLI 项目,它以 .NET Framework 3.5 和 PlatformToolset v90 为目标。最初它请求版本 9.0.21022.8 的 VC CRT,但如果我包含 atlbase.h 标头,则它请求版本 9.0.30729.6161 的 VC CRT。为什么会这样?以及如何在不包含 atlbase.h 的情况下使其目标 9.0.30729.6161?
我试图定义宏 _BIND_TO_CURRENT_CRT_VERSION=1 和 _BIND_TO_CURRENT_VCLIBS_VERSION=1 但这没有帮助。