首页

Visual Studio 对 C++ 头文件和模块的支持  

在 C++ 编程领域,头文件和模块的管理有时候确实比较令人头疼。但是,有许多工具和功能可以简化此过程,提高效率并减少出错的可能性。下面是我们为 C++ 头文件和模块提供的几种工具的介绍。 构建明细 通过菜单栏 Build > Run Build Insights,可以打开构建明细窗口。 此工具提供对“包含文件”和“包含树”视图的见解,以分析和优化 #include 使用情况。 例如,在 b...

为什么资源管理器里不显示文件夹大小?  

如果你好好看看电脑的资源管理器,你会发现:资源管理器中的文件不会显示其大小,而仅仅显示了文件的大小。 问题来了:为什么不可以在资源管理器中显示文件夹的大小呢?这不是一项很方便的功能吗? 如果你看过我之前的一篇关于计算机网络中不会自动探测所有主机的文章的话,则原因你可能已经猜到了。 这样做会使公司的内部网络崩溃,此话怎讲? 我们假设这样一个场景,在一个公司内部网络中,有一个大型的文件服务器,如果现在...

请勿假设你的用户都有管理员权限  

有些人觉得自己很聪明,他们在程序中做了这样一项”优化”。 在程序的安装阶段,他们不会安装某些程序功能,而是等到用户第一次使用的时候才执行,也即所谓的 “按需加载”。 问题在于,第一次使用的时候,用户可能没有管理员权限,而安装阶段一般都要求管理员权限。 举个例子,有一个流行的多媒体软件,用户在第一次使用的时候,才会安装 CD AutoPlay 处理器,...

传递一个比实际字符串大的缓冲区长度会怎么样?  

如果你在 Win32 的世界摸爬滚打过几年,则你会发现:很多函数如果要传入一个源字符串,则通常会有两个参数,一个是字符串缓冲区指针,另一个是字符串缓冲区长度。 如果传递的缓冲区长度,大于实际的字符串长度,则结果和函数的内部实现相关。 一些函数在给定字符串和长度时,会在长度用尽或者遇到空终止符时停止,以先到者为准。 举个例子,我们看一下 StringCchCopyN 的函数原型: STRSAFEAP...

设计阶段就需要考虑的事情:如何处理用户数据  

我们考虑这样一个问题: 某一天,用户要卸载你的程序了,在卸载过程中,用户的数据如何处理?是删除?保留,还是其他? 这的确是一个问题。 这里说的用户数据,可能是保存在 HKEY_CURRENT_USER 注册表下的数据,也可能是保存在用户配置文件夹下的数据。 我的建议是:不,请不要删除它们。 原因有几点 第一,弄乱未登录用户的配置文件可能会导致数据损坏,用户可不希望他们自己的数据被损坏。 第二,用户...

请勿在没有透彻理解的情况下使用前台窗口  

有一次,我在帮助一家软件开发商研究他们应用程序中的一个兼容性 Bug。通过这次研究,我想写一篇文章来讲讲窗口相关的细节知识。 这是一个安装包程序,在安装的某个时间点出现了错误,开发商希望能够显示一个错误对话框,当他们调用 DialogBox 的时候并没有传递安装包主程序窗口作为它的父窗口参数(hwndParent),而是为了方便,他们直接调用了 GetForegroundWindow() 并作为父...

为什么进程最多只能创建 10000 个窗口?  

如果你的程序是一条脱缰的野牛,你任由它随意运行,则你会发现这样一个规律: 它最多只能创建 10000 个窗口,系统将不会让你创建更多的窗口。 问题来了,为什么是 10000 ? 当你需要问这样一个问题的时候,就应该意识到:这事儿一开始不对。 因为早在设计之初,程序就不应该创建这么多窗口,仔细想想,10000 多个窗口,你的客户顶的住吗? 在上一篇文章中,我们提到,窗口管理器最多可以创建大约 327...

Visual Studio 小更新:改善变量的可见性  

在 Visual Studio 2022 17.10 预览版 2 中,我们改善了一些小功能,例如:在调试版本中,变量窗口现已可以显示调用堆栈中任意帧的局部变量。 如需体验此功能,请直接安装最新预览版本,就可以知道是怎么一回事儿了。 问题:变量窗口中缺失的东西 你是否碰到过这样的问题? 我们正在调试一些代码,并在函数 foo 中命中了一个断点。我们需要在调用堆栈的上方检查一些局部变量的值,因此我们打...

我们来看看窗口句柄的底层实现  

你是否有思考过这样一个问题: 如果你有一个窗口句柄,但是它所引用的窗口已经被销毁了,对这个窗口发送消息 (通过调用 SendMessage) 会发生什么事情?更加糟糕的是,窗口句柄可能被其他窗口重用了,这就使得问题更加复杂。 很显然,对一个已销毁的窗口发送消息是程序的一个BUG,但是由于这个问题十分普遍,在 Windows NT 中,负责窗口管理器组件的开发人员决定采取更为主动的方式来解决问题。 ...

QueryPerformanceCounter 的不当用法  

有人问了我这样一个问题: ” 我需要在我的程序中需要生成一些独一无二的标识符,当然,我可以使用 GUID 来实现,但是 GUID 对我的实际使用场景来说实在是太大了,我做了一些功课,发现有 QueryPerformanceCounter 这个函数: [System.Runtime.InteropServices.DllImport(“Kernel32.dll”)...