您的位置:首页 > 编程语言

关于Windows编程中一些注意事项——程序运行时的出错,而调试却没有错

2013-12-14 09:22 691 查看
小伙伴们你们有木有遇到这种情况,一个程序直接运行时出错,而当你选择调试时(不管是单步调试,还是断点调试),程序就可以正确的运行。最近我就遇到了这个问题。在纠结了几天之后我终于找到了问题所在。这里写一下文章记录一下吧。

这里说明一下事情的背景,程序是这个样子的分成两端,一下就简称A、B两端了。在 A 端向 B 端发送命令,B 端截取当前屏幕存成 .jpg 图片,并发送给 A 端显示。这里截取屏幕我是通过向系统发送 “Print Screen” 按键按下的消息,将当前屏幕的截图保存到剪切板中。这里保存的格式是BITMAP。然后再通过 jpeg 压缩算法生成 .jpg 格式的图片。

下面详细说一下问题。我的 A 、B 两端是两台电脑,(我的台式机和笔记本)但是通过 Input Director 这个软件让我的两台电脑共享一套鼠标和键盘。这里你可能会疑惑我为什么会说这个?别着急我慢慢解释。关于截图的程序,我是单独测试过的没有问题。关于两端之间传文件我也是单独测试过的没有问题。当时当我把两者结合一起使用时就出问题了。那就是两台电脑测试直接运行时总是无法生成图片,所以导致发送文件时就出现了找不到文件的错误。但是当我调试运行时,每一次都可以正确的运行通过。这里我就很纳闷到底是什么错误会导致这种奇葩的问题?后来经过许久的纠结我发现问题就出现在下面这一句上面:

HGLOBAL hcilp = GetClipboardData( CF_BITMAP ); (用来从剪切板中获取数据,获得剪贴板的内存块首地址)

每次直接运行时 hcilp 总是NULL。而每次调试运行时却可以得到正确的句柄。

开始我以为是因为上面发送 “Print Screen” 按键按下的消息 的问题,因为程序执行的太快,系统没反应过来。后来我尝试着让程序睡眠等待一段时间,但是我发现即使将睡眠时间改的很大也是无法正确运行。

看到这里,可以好好想一下为什么呢?

后来我发现调试运行和直接运行的差别在哪里。前面说过我是两台电脑共用一套键鼠,所以当我直接运行时发送命令的是 A 端也就是我的笔记本,而这时我的鼠标光标是在笔记本端的,但是执行截屏命令的却是 B 端也就是我的台式机。发送 “Print Screen” 按键按下的消息 的也是台式机。但是接下来的打开剪切板 时获取的活动窗口却是我的笔记本,所以打开的是笔记本的剪切板,而此时该剪切板中却没有 CF_BITMAP 类型的数据。所以才会出现上述的问题。但是当调试运行时我却必须将鼠标光标移到台式机。

所以我想以后一定要注意类似的问题了。可能再也不会有类似的情况了。但是我还是记一下,给大家提个醒吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: