最近这段时间用vc做了一个客户端程序,好长时间不做这种程序了,很是生疏,由于接手的别人的二手项目,大部分代码都已经完成了,只是跑起来问题很大,很多意料之中和意料之外的问题让人又爱又恨。其中遇到了两个函数造成的奇怪问题,好好分析找到了原因,都是一些平时不注意,对一些函数错误的使用造成的。下面说说这两个函数。

1、GetCurrentDirectory

DWORD WINAPI GetCurrentDirectory(__in   DWORD nBufferLength,__out  LPTSTR lpBuffer
);

这个是函数原型,他是主要是作用是获取程序的当前目录,大部分指的是当前运行程序所在的运行目录。记得这个地方说的是大部分情况,不是所有,有些特殊的情况会返回时其他的路径。我们的程序在运行中需要有监护程序来引导,当我写完监护程序让他引导进入主程序的时候发现了奇怪的问题,程序整个界面打乱,一张图片都没有,去目录下查找图片存在,而且直接运行主程序没有这个问题。我们在主程序里面跟踪也没有头绪,每个函数都运行的正常的出奇,没有一点不妥的。可是就是在监护程序引导的情况下出现异常。经过判断感觉是路径发面出现问题,导致找不到图片。我们查看获取路径的函数,发现使用了GetCurrentDirectory,这个获取当前目录的函数按照常理应该没有问题,细想我们是在监护程序里面使用的shell把主程序调用起来的,应该是忘记了设置工作目录造成的吧,于是修改监护程序,设置工作目录,依旧无果,特殊调试发现这个函数获得的路径是监护程序的位置,看来这个GetCurrentDirectory函数本身应该是出了问题,我们使用的错误。后来查看了一些资料,微软也承认这个函数有时候不是那么恰当,他的这个获取的值收到很多的影响,所以如果只是为了获取当前程序运行路径,建议使用GetModuleFileName这个函数来处理,这个比较准,因为他获得是当前运行程序的存储路径。我们的程序也是使用这个之后恢复正常的。

2、GetParent

这个函数就本身使用来说是没有什么问题,只是我们有些时候在开发桌面应用程序的时候需要用的某个窗口置顶的问题,通常解决方法就那几个setforegroud之类的,可是这些问题都受制于如果你的父窗口不直前你也别想在最前面,所以通常会用SetParent(NULL)函数来搞掉父窗口。当搞掉父窗口之后GetParent函数也就废掉了,获取的值是NULL的。很多时候在vc里面操作父类的界面都需要拿到父类的句柄,然后再获取父类里面的某些控件的值,例如子窗口获取父类列表当前选中的值。当窗口不值钱,用GetParent一切ok,后来为了置前弄了SetParent(NULL),编译无措,运行时候系统告诉你无效句柄,呵呵,这个问题好调出来,但是如果bug夺得焦头烂额的时候也是很难被发现的。对于这个的建议我们还是建议在基类里面默认设置一个包含父类句柄的变量,这样直接用就ok了。

上面的这些问题都是一些不良的编程习惯或者随意猜测函数弄出来的问题,总结上面的问题以后我再开始一个大型的c++项目之前一定要做好前期的设计,基础框架要做好,充分的用好几个好的设计模式,集中管理一些资源,界面等容易出现泄露问题的。等这个项目结束之后总结一些在大型C++项目里面基础框架必须包含的东西来分享一下。

危险的两个函数GetCurrentDirectory和GetParent相关推荐

  1. ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数

    题目描述 写两个函数,分别求两个整数的最大公约数和最小公倍数, 用主函数调用这两个函数,并输出结果两个整数由键盘输入. 输入 两个数 输出 最大公约数 最小公倍数 样例输入 6 15 样例输出 3 3 ...

  2. 获取文件名称的两个函数

    获取文件名称的两个函数 FORM f4_filename  changing c_file. CALL FUNCTION 'KD_GET_FILENAME_ON_F4' EXPORTING mask ...

  3. 两个函数彻底理解Lua中的闭包

    本文通过两个函数彻底搞懂Lua中的闭包,相信看完这两个函数,应该能理解什么是Lua闭包.废话不多说,上 code: 1 --[[************************************ ...

  4. crc16算法php实现,关于实现CRC16校验算法的两个函数

    之前在2017年2月份发布过一个主题,也是关于CRC16的,现在我直接把函数写出来,希望能帮到有需要的朋友.对于在线监测设备数据传输标准来说,CRC16校验算法有基于通用modbus协议的,有基于环保 ...

  5. php获取总共内存_php获取页面运行使用内存的两个函数

    原来php也是可以获取内存的,比如我们这个页面运行下来花了多少内存,都是可以用memory_get_usage()函数来读取出来的.那么,以后我们可以用这个函数方便的判断咱们写的程序优化度高不高,因为 ...

  6. ML之分类预测:分类预测评估指标之AUC计算的的两种函数具体代码案例实现

    ML之分类预测:分类预测评估指标之AUC计算的的两种函数具体代码案例实现 目录 分类预测评估指标之AUC计算的的两种函数代码案例实现 输出结果 实现代码

  7. python中os.path.join()的循环用法_Python中.join()和os.path.join()两个函数的用法详解

    Python中有.join()和os.path.join()两个函数,具体作用如下: . join():    连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 ...

  8. python3 join函数_Python中.join()和os.path.join()两个函数的用法详解

    Python中有.join()和os.path.join()两个函数,具体作用如下: . join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 '' ...

  9. 编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值。在main函数中输入一行字符串,分别调用两个函数,输出反序后的字符串。

    题目要求: 编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值.在main函数中输入一行字符串,分别调用两个函数,输出反序后的 ...

最新文章

  1. SQL自动流水号函数
  2. GitHub 上100个优质前端项目整理,值得收藏!
  3. shell中的${},##和%%的使用
  4. LoadRunner+Android模所器实现抓包并调试本地服务端
  5. 花器官身份基因与靶基因间的调控进化情况
  6. Android-01:扫描SD卡以.xxx结尾的文件
  7. 基于 jmeter 的分布式性能测试实战
  8. android系统应用程序,Android调用系统应用程序
  9. 解决iSlider的一些问题(滑动组件)
  10. [转载] 中华典故故事(孙刚)——01 天要下雨_娘要嫁人
  11. Google退出中国的三大原因和四大后果(转载)
  12. STM32F407 USB CDC调试与经验总结
  13. UNet++ 论文翻译
  14. 路由器,猫,交换机的区别
  15. IP地址0.0.0.0是什么意思?
  16. 经验分享 | 我的八股文学习路线及攻略
  17. 骁龙780g相当于什么处理器 骁龙780g什么水平
  18. 家电龙头业绩高 机构重仓股票名单!
  19. springboot 如来佛祖,永无bug
  20. 如何使用graphpad做柱形图_Graphpad绘制柱形图&散点图

热门文章

  1. 零窗口探测怎么抓包_万事俱备,只待“窗口”!航天任务中的重要环节:“发射窗口”!...
  2. new float查询长度 c++_C/C++经典面试题
  3. JAVA 开发axis2_基于Apache axis2开发Java Web服务
  4. 生成word_Word如何生成目录?3个步骤轻松掌握!
  5. python 漂亮界面demo_在这个什么都看脸的时代,如何用 GUI 提高 python 程序的颜值?...
  6. ffmpeg抓取rtsp流并保存_详细解析RTSP框架和数据包分析(1)
  7. SpringCloud Feign实战(二)
  8. 2020年快手短视频直播电商营销增长宝典
  9. 作者:郑理,男,南京邮电大学计算机学院项目研究员。
  10. 作者:潘永花,阿里数据经济研究中心秘书长,阿里研究院高级专家。