问题标签 [visual-c++-2015]

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 投票
1 回答
558 浏览

visual-c++ - LoadLibrary 在 XP 嵌入式上失败,出现 0xC000001D,但在 XP Pro 上按预期运行

我有一些相当旧的进程内 ATL COM 服务器,以前使用 VC++ 2005 构建。

现在这些项目都移植到了VC++ 2015。
由于我需要支持传统的Win XP系统,平台工具集是“VS 2015 - Windows XP”。另外,根据这个问题/Zc:threadSafeInit-设置了编译器选项。

所有服务器都是使用 ATL 属性编写的,每个项目中都有这样的内容:

问题。所有这些项目在 WinXP Pro 上运行良好。但是当我尝试在 XP Embedded 机器上注册它们时,我会收到 0xC000001D 错误代码LoadLibrary

如何修复/诊断此错误?

PS 如果这是有道理的,XP 嵌入式系统是建立在 AMD Geode 处理器之上的,而 XP Pro 系统是建立在普通 Intel 处理器之上的。

0 投票
0 回答
369 浏览

c++ - C4503 警告,但名称似乎没有那么长

我收到一个警告 4503“超出装饰名称长度,名称被截断”的问题。整个大项目中只有一个,而且这个名字似乎也不是特别长,就 Boost 模板而言!

MSVC++ 编译器的每个版本都扩展了限制,所以我希望 VS2015 可以轻松处理 Boost MPL。

那么为什么警告出现在这个(而且只有这个)上,一个相对平凡的模板用法?任何涉及 CRTP 的类的智能指针都会显着延长。

由于我在此站点上阅读了其他答案,因此我犹豫是否要禁用该警告。尤其是它是如此罕见,我想知道它发生了什么。

0 投票
1 回答
61 浏览

c++ - Visual Studio C++ 链接未使用的全局变量

我有 mylib.lib:

和 proxylib.lib:

和exe项目:

主项目引用了proxylib.lib 项目,proxylib 项目引用了mylib.lib 项目。在编译并将项目链接到最终的 exe 后,我从 exe 中的 mylib.lib 中获得了未使用的全局变量“arr”,即使函数“foo”不在 exe 中。为什么 ?

谢谢 !

0 投票
2 回答
2411 浏览

c++ - 使用安全 _vsnprintf_s 获取所需的缓冲区长度

我正在尝试更新一些“遗留”代码以符合 MSVC 的最新安全更新,并且在_vsnprintf_vsnprintf_s.

特别是,我_vsnprintf使用空缓冲区和计数/长度为零进行调用,获取结果,分配所需大小的缓冲区(return value + 1),然后_vsnprintf使用新分配的缓冲区和已知正确的大小再次调用:

此行为记录在 MSDN 上

如果由 count 指定的缓冲区大小不足以包含由 format 和 argptr 指定的输出,则 vsnprintf 的返回值是在 count 足够大的情况下将写入的字符数。如果返回值大于 count - 1,则输出已被截断。

我正在尝试对 做同样的事情_vsnprintf_s,但它的文档不包含相同的. 相反,它说

如果存储数据所需的存储空间和终止 null 超过 sizeOfBuffer,则调用无效的参数处理程序,如参数验证中所述,除非 count 为 _TRUNCATE,在这种情况下,写入缓冲区的尽可能多的字符串,并且 - 1返回。

无论如何尝试以下方法:

这导致“长度”为零。如果您传入_TRUNCATE(-1) 作为计数,则以下断言将失败:

表达式:buffer != nullptr && buffer_count > 0

我认为可以覆盖_set_invalid_parameter_handler并以某种方式找出长度应该是多少,但是必须有一种更简单的方法吗?

0 投票
1 回答
211 浏览

winapi - 在 VS2015 中替换 __wgetmainargs

现在我正在使用__wgetmainargs为了检索代表用户环境中设置的变量的字符串数组。

使用 VS2013 一切正常,但是,使用 VS2015 我得到error LNK2019: unresolved external symbol __wgetmainargs错误。

我发现这已被删除,这CommandLineToArgvW是一个替换,但我不需要命令行参数,我需要环境数组(由于某种原因我不能使用_wenviron,我只是在那里得到垃圾)。

我必须将哪个库添加到链接器或我可以使用哪个替代 API?

0 投票
1 回答
284 浏览

floating-point - 如何舍入浮点数?C++/CLI - VS2015

假设有两个浮点数:a, b。我需要将 a 的值分配b。然后b将通过一个函数转换为文本字符串,我无法更改。转换是通过取浮点数的前 3 位小数而不四舍五入来完成的,其他点被忽略。这会导致准确性的损失。

问题:我怎样才能改变a的值,那么在转换后b会像四舍五入一样吗?

希望我设法解释了问题,但如果没有,请告诉我。

0 投票
2 回答
62 浏览

c++ - VS2015从windows程序中删除linux上的文件

我们在 Windows 上有一个服务器,但它有一个网络驱动器,它实际上是在一个 linux 服务器上。该程序必须删除同一位置的同名文件(信号),当这些文件在本地驱动器上时它可以正常工作,但是当在网络驱动器上运行时,它有时不会删除该文件,更糟糕的是,这些函数将返回一切正常(意味着文件被删除)。remove我用, _unlink,试过了,DeleteFileA问题仍然存在,有时完全随机它不会被删除,它会保持这样的状态。

代码非常简单:

即使没有删除文件,这也将始终返回 true,例如,如果它没有权限,它应该会失败(并且每次都失败,而不是随机失败),有人可以给我一个想法吗?我用完了选项:(

编辑: 感谢@ExcessPhase,看来moveFile实际上检测到了错误,因此在删除之前重命名可以检测到问题“ERROR_FILE_NOT_FOUND”。

其他事情:这个随机问题只有在从 linux 服务器创建文件时才会发生。如果我从 Windows 创建它们,它们将始终被删除。更重要的是:如果我有一个程序无法删除的文件,并且我从 Windows 旁边创建了另一个文件,程序将检测并删除它之前无法删除的文件。

Edit2:更接近答案:文件名testTEST在 linux 中是不同的,而在 Windows 中是相同的。当大小写不匹配时,问题似乎随机出现。但我不确定,因为它是如此随机。

0 投票
1 回答
512 浏览

c - Visual C++ 2015 /GL(整个程序优化)和 /OPT:REF(优化引用)防止调用静态初始化程序

简介: C++ 中的全局静态对象在启动前被初始化main()。考虑:

输出是glob = 1, 因为calc_it()和分配是在main()开始之前执行的。代码的顺序与它无关。

现在想象一下,您有多个带有类似代码的源文件,并进一步想象它们以某种方式相互依赖(无论出于何种原因,您都想要某种执行顺序。我们不要讨论这是好的还是坏的设计。)

执行的顺序不是由标准定义的,但是在 Visual C++ 中有一些方法可以对它们施加一定的顺序。对于全局静态对象,可以#pragma init_seg(SECTIONNAME)在对象定义的前面使用来指定某个节名

但最后这只会导致编译器将(__cdecl *)(void)指向函数的指针放在某些链接器部分(它们都以 开头.CRT$XC)。在链接器确定内存布局之前,节名称按字典顺序排列。默认部分名称是.CRT$XCU. 然后,C/C++ 初始化代码将这些段的内容.CRT$XCA视为.CRT$XCZ函数的指针,并一一调用。

我们也可以使用#pragma data_seg(SECTIONNAME)指令手动执行此操作。所以这:

将输出:

那有多好?:)

问题描述:/GL AFAIK,自 Visual C++ 2015 起,如果您将选项(整个程序优化)与/OPT:REF链接器选项(删除未使用的函数和数据)一起 使用,这将不再有效。原因可能是从链接器的角度来看,_init_ptr从未使用过。在较旧的 Visual Studio 版本中,这仍然有效,因为它们从不删除未使用的数据,只删除使用的代码

问题:如何仅针对单个符号避免这种情况?

0 投票
1 回答
2484 浏览

visual-studio - 如何从 Visual Studio 污染中提取源代码文件?

在源代码所在的目录中,还有Visual Studio相关的文件,如*.user、*.vcxproj。和文件DebugRelease

我想更改项目目录布局,使其看起来像这样:

例如,该项目名为 ProjectX。

在 ProjectX 主文件夹中,只有两个子文件夹:

  • ProjectX/源

  • ProjectX/构建

在 ProjectX/Source 中将有所有源代码文件,但没有别的。

在 ProjectX/Build 中会有所有与 Visual Studio 相关的文件。

我该怎么做?

0 投票
0 回答
321 浏览

c# - 在 Windows 7 升级到 10 后检查 VC2015 可再发行组件(无更新 vs update1 vs update 2)

我有一些软件可以在加载和调用需要它的 DLL 之前检查是否安装了 Visual C++ 2015 x86 可再发行组件。检查是通过对 的互操作调用完成的MsiQueryProductState,使用以下声明

电话是

它曾经可以工作,现在仍然可以在其他安装了 Windows 10 并安装了原始的、未更新的可再发行组件的机器上工作。

我将 VS2015 与 Update 2 一起用于 C# Windows 桌面开发,其中包括可再发行更新 2。

几周前,我将Windows 7升级到Windows 10,昨天发现支票从returnsINSTALLSTATE_DEFAULT变成了returns INSTALLSTATE_UNKNOWN。我不确定这是否与问题有关,因为我是在升级后才发现的。

谷歌搜索并一无所获后,我搜索了注册表和可再发行安装日志文件,我找到了以下键

但如果我做对了,我一点也不知道——前两个返回INSTALLSTATE_UNKNOWN,后两个返回INSTALLSTATE_DEFAULT。哪个有效,但我不知道它是否正确。我认为所有版本和更新都将使用相同的密钥。

所以,我想问的问题是:我应该查询哪些键才能知道是否安装了 Visual C++ 2015 x86 Redistributables 的兼容版本,是没有更新、更新 1 还是更新 2?