首页

VisualStudio静态分析工具:C++ Core Check  

C++ Core Check简介 C++ Core Check是微软开发的一款用于对C++代码进行静态分析的工具。通过C++ Core Guidelines规则对代码进行规则一致性判定,从而促使开发者能更加容易的观察到代码中可能存在的缺陷,进而提升代码整体质量。 在今天的文章中,我们会简单的介绍C++ Core Check对C++ Core Guidelines的覆盖情况。 早在2015年,微软的...

使用Visual Studio开发调试QT应用  

Visual Studio QT扩展新版本出炉 QT是一款十分流行的跨平台开发框架,它包含的库和工具集可以用来创建,测试和部署跨平台应用,支持多种不同操作系统,包括Linux,Windows,macOS和各种嵌入式系统。 最近QT开发团队发布了QT Visual Studio扩展的一个全新版本,可以用来将其整合到Visual Studio的Linux开发工具集中,这样,开发者就可以直接在Visua...

新的C++安全编码规则出炉  

新的安全编码规则 在Visual Studio v16.8 Preview 3中,我们添加了一些新的安全编码规则,来帮助开发者更容易找到一些更加容易导致Bug的编码错误,这些错误涵盖了从简单的功能缺失到严重的安全漏洞问题。 这些规则都是来自于真实世界的产品缺陷报告,在微软,我们会在我们的每一款产品中运行这些安全编码规则,以满足产品在安全和合规方面的需求。 在今天的文章中,我们会介绍VARIANT及...

TopomelBox 1.0发布

今天,2020年10月8日,我们很高兴地宣布:TopomelBox的首个版本1.0正式发布。 就像它的名字一样,TopomelBox可以看做是一个办公小工具的集合,在此次的版本中,主要涵盖的功能包括远程桌面分享,文件传输及聊天等常用功能。 此版本虽然经过了尽可能多的测试,但是天下没有没有Bug的代码,我们期待着收到你的各种问题反馈,或者使用感受。 作为一名独立开发者,从一个想法最初地闪现到首个公开...

为什么GetProcAddress获取不到dllexport导出的函数?

名称修饰(decoration)的好处和坏处 dllexport属性告诉链接器:请将指定的函数标记为导出并为它生成一个导出项。 这个导出项是经过修饰的,对于导出多个重载的函数来说,导出修饰后的名称是十分必要的。但是,这也意味着:你传入到GetProcAddress函数中的函数字符串也需要是修饰版本的。 从我们之前的几篇关于调用约定的文章中,我们知道,函数导出名称的修饰语法在各种硬件平台上是各不相同...

为什么只有静态成员函数才能作为回调函数?  

隐藏的this指针 对于非静态成员函数来说,它携带了一个隐藏的”this”指针,这导致它不能满足Win32回调函数签名的要求,这样的结果就是:一个非静态成员函数,不能作为一个合法的Win32回调函数。 幸运的是,几乎所有的回调函数都提供了一些方法来感知调用上下文。你可以将这个”this”指针作为一个上下文环境来重构代码,下面是一个例子: 有一些回调...

有关调用约定的历史 – 第三部分

好了,可以讲讲大家熟悉的东西了 今天的第三部分,主要内容是x86平台上的32位调用约定。 这里先说明一下:今天的内容只会涵盖Windows操作系统或者Windows编程中涉及到的调用约定,没有关于其他操作系统或者特定于某个语言或者编译器厂商的内容。特别需要注意的是,如果尝试在C++中调用一个成员函数,则函数的第一个参数是一个”隐藏”的this指针。 All 所有在x86平台...

有关调用约定的历史 – 第二部分

预告 今天的文章主要是延续之前有关调用约定的主题,接下来我们要讲述的内容,对于我们后面的一些讨论议题会比较有帮助。 有个需要注意的地方是:在众多的硬件平台上,只有8086和x86平台存在多个调用约定,其他的平台都只有一个。 我们接下来会深入到有关32位调用约定的细节,也许很多人都不太关心这个,但是还是值得讲一讲。 All 在这篇文章里列出的所有的处理器都是RISC类型,这意味着:处理器上有搭载很多...

为什么拷贝对话框的估计时间如此不准确?

请稍等1分钟… 因为拷贝文件对话框里的剩余时间都是猜测出来的。 操作系统无法预测文件的精确拷贝时间,但是它有时候不得不这样尝试这样做。在拷贝操作的最初阶段,如果没有之前可以参照的历史记录,则这个预测将十分不准确。 下面是猜测逻辑 假如有人告诉你:”我将执行一个操作,同时从0开始计数,一直到100,而你只需要给出持续性的估算直到操作完成”。 你观察到:这些计数会每...

为什么早期x86处理器寄存器很少?

来自读者的问题 有读者在看我之前的关于16位系统上的调用约定的文章时,有这么一个问题:为什么在早期x86处理器上可用的寄存器为什么那么少? 8086是一款16位的微处理器,比它更早的是8080。它有6个8位寄存器,分别命名为:A, B, C, D, E, H和L。通过两两组合,我们可以用它们产生16位的虚拟寄存器,例如:BC, DE和HL。 另外,你甚至可以将一个16位的地址放入HL寄存器,并用另...