一个CFile::Remove引起的奇怪问题
今天收到测试的一个反馈,我们的一个程序,在WIN7、WIN8下安装后,运行不起来,在进程列表中可以看到,但就是不出来窗口,同样的程序在XP下正常,在UAC关闭的情况下也正常,在以管理员权限运行时也正常。
现象有点奇怪,但也有一个规律,就是在UAC开启的情况下,如果不是以管理员权限运行,则会出问题,根据程序现象,我从代码上排查,发现就在程序启动的代码部分即“挂起”,这里的现象类似于挂起,因为是程序运行到某一处就不再往下运行了,我们可以确定的是单实例运行互斥的代码没有被执行到。
到这里就好跟了,因为往上走的代码是较少的,接下来通过逐段调试的方式,发现最终问题在于调用了一个MFC的类的静态函数导致:CFile::Remove,发现在调用这个函数的后续代码便没有再执行了。这里已经基本可以确定是由于没有权限删除相关文件导致出现这个问题了。
难道程序真的挂起了,这个函数会阻塞?
接着往下分析,我们通过查看这个函数的源码,具体如下:
void PASCAL CFile::Remove(LPCTSTR lpszFileName)
{
if (!::DeleteFile((LPTSTR)lpszFileName))
CFileException::ThrowOsError((LONG)::GetLastError(), lpszFileName);
}
这个函数其实只是调用了DeleteFile,当调用失败时,抛出异常。 问题又来了,如果是有异常,我们的程序应该会有异常抛出来才是啊,因为这部分代码没有在try块中,为什么他就悄无声息的停止运行,但进程又还在呢?
进一步分析发现,我们使用了minidump来进行结构化异常的捕获,以便在程序发布后,能够获取到程序异常的相关信息,找到问题点。
就是因为这个异常捕获,导致了这里CFile::Remove函数抛出来的异常没有在程序中暴露出来,变成了一个隐藏的BUG,导致了这样奇怪的问题现象。
在此记录此问题,以便后续查找,也希望能给有碰到类似问题的朋友提供参考。
一个CFile::Remove引起的奇怪问题的更多相关文章
- C++ 文件操作(CFile类)
原文:文件操作(CFile),C吉羊 一.Visual C++编程文件操作 有如下方法可进行操作: (1)使用标准C运行库函数,包括fopen.fclose.fseek等. (2)使用Win16下的文 ...
- 【转】MFC中用CFile读取和写入文件2
原文网址:http://blog.sina.com.cn/s/blog_623a7fa40100hh1u.html CFile提供了一些常用的操作函数,如表1-2所示. 表1-2 CFile操作函数 ...
- vc++基础班[21]---文件的基本操作之CFile
①.文件的创建.打开.关闭: 文件的创建.打开:CFile::Open 文件的关闭:CFile::Close CFile::modeCreate:以新建方式打开,如果文件不存在,则新建:如果文件已 ...
- CFile CStdioFile CArchive 文件操作之异同(详细)
两者的主要区别: 一. CFile类操作文件默认的是Binary模式,CStdioFile类操作文件默认的是Text模式. 在Binary模式下我们必须输入'\r\n',才能起到回车换行的效果, ...
- 调试台自动多出现一个'' ,我 用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个''
对你有助请点赞,请顶,不好请踩------送人玫瑰,手留余香! 15:54 2016/3/12用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个' ...
- 一个类搞定UIScrollView那些事
前言 UIScrollView可以说是我们在日常编程中使用频率最多.扩展性最好的一个类,根据不同的需求和设计,我们都能玩出花来,当然有一些需求是大部分应用通用的,今天就聊一下以下需求,在一个categ ...
- Ceph:一个开源的 Linux PB 级分布式文件系统
探索 Ceph 文件系统和生态系统 M. Tim Jones , 自由作家 简介: Linux®持续不断进军可扩展计算空间,特别是可扩展存储空间.Ceph 最近才加入到 Linux 中令人印象深刻的 ...
- 一个类搞定UIScrollView那些事儿
前言 UIScrollView可以说是我们在日常编程中使用频率最多.扩展性最好的一个类,根据不同的需求和设计,我们都能玩出花来,当然有一些需求是大部分应用通用的,今天就聊一下以下需求,在一个categ ...
- CFile类的open方法中的参数说明
CFile::Open是在MFC里面,打开一个文件的方法. Open函数的原型如下: virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, ...
随机推荐
- iOS开发——总结篇&关键字介绍
关键字介绍 在做iOS开发中,系统的各个关键字处处都是,但是未必每一个关键字都是那么的明白,所以罗列出一些关键字供大家互相学习,有不完善之处请指正,谢谢 atomic atomic是Objc使用的一种 ...
- typedef 优于 #define
案例一: 通常讲,typedef要比#define要好,特别是在有指针的场合.请看例子: typedef char *pStr1; #define pStr2 char *; pStr1 s1, s2 ...
- GNU C中x++是原子操作吗?
http://blog.csdn.net/liuaigui/article/details/4141563
- mysql router 自动failover测试
mysql router 启动服务文件内容: [root@monitor mysqlrouter]# cat /etc/init.d/mysqlrouter#! /bin/bash## mysqlro ...
- Haproxy图解
http://blog.csdn.net/tantexian/article/details/50056199
- Python学习 之 正则表达式
1.简单的正则表达式 import re s=r'abc' re.findall(s,"aaaaaaaaaaaaaaa") #结果为[] re.findall(s,"ab ...
- UNIX基础知识之出错处理
当UNIX函数出错时,常常会返回一个负值,而且整型变量errno通常被设置为含有附加信息的一个值.例如,open函数如成功执行则返回一个非负文件描述符,如出错则返回-1.在open出错时,有大约15种 ...
- 实例源码--Android时钟源码
下载源码 技术要点: 1.Android自定义时钟控件 2.源码带有非常详细的中文注释 ...... 详细介绍: 1.Android自定义时钟控件 通过继承视图继承类View进行自定义控制,实 ...
- HBase Error: connection object not serializable
HBase Error: connection object not serializable 想在spark driver程序中连接HBase数据库,并将数据插入到HBase,但是在spark集群提 ...
- Android(java)学习笔记97:Scanner类使用
package cn.itcast_01; /* * Scanner:用于接收键盘录入数据. * * 前面的时候: * A:导包 * B:创建对象 * C:调用方法 * * System类下有一个静态 ...