为什么可以引用未包含的头文件内容?

缘起
最近几天奉老大之命学习研究了一下VCFVCFBuilder。我在修改编译错误的时候发现有些头文件里面引用了其他头文件里面的类,但是在该头文件里面有没有引入任何其他头文件。编译的时候也没有提示这个错误,按照我的惯性思维,这很不可思议啊!这也让我想起了VC编译环境提供的预编译头StdAfx.h也是这个现象,当时就很纳闷,可是没仔细想。这次又碰到了,忍不住想弄个明白,问了几个大虾,没有答案。那就自己来吧。

(阅读全文……)

24 05月

CTreeCtrl 树状控件显示展开和折叠的按钮“+/-”

让树状控件显示展开和折叠的按钮其实是很简单的,把 Style 设置成TVS_HASBUTTONS就可以了。不过你可能会发现根节点却没有展开折叠按钮,咋回事呢?折腾半天也没作用,还是看看MSDN的文档吧。

TVS_HASBUTTONS
Displays plus (+) and minus (-) buttons next to parent items. The user clicks the buttons to expand or collapse a parent item’s list of child items. To include buttons with items at the root of the tree view, TVS_LINESATROOT must also be specified.

(阅读全文……)

Posted by 王永杰 in C&C++ - Comments (0)
14 04月

让串口能够自发自收

很简单,把管脚2(收)和管脚3(发)短接起来就可以啦,位置见示意图。

九针串口各脚的定义如下:
1 DCD 载波检测
2 RXD 接收数据
3 TXD 发送数据
4 DTR 数据终端准备好
5 SG 信号地线
6 DSR 数据准备好
7 RTS 请求发送
8 CTS 清除发送
9 RI 振铃指示

参考链接

1. Linux 下串口编程入门
2. Serial Programming Guide for POSIX Operating Systems

串口示意图

Posted by 王永杰 in 技术为本 - Comments (0)
25 03月

Gmail 两个比较有用但比较隐蔽的功能

1. 快捷键

Google Reader 和 Gmail 的快捷键都是很丰富的,而且很实用。可是作为新手用的还很不熟练,经常需要查看快捷键列表,从帮助里面查当然是有点繁琐了。这里有个捷径哦,试试输入一个“?”!很酷的一个列表就跳出来了,是不是很便捷?

2. 邮箱末尾加“+任何内容”

在邮箱末尾加上一个加号,后面再加上一些字符,比如someone+tianya@gmail.com,Gmail同样会将邮件发到 someone@gmail.com。这个功能便于搜索和创建过滤规则的,Gmail 除了可以从发件人地址进行过滤外,还可以从收件人地址进行过滤。比如天涯论坛注册的邮箱是someone+tianya@gmail.com,那么我可以设置这样一个过滤规则:凡是收件人为someone+tianya@gmail.com的邮件都标记为“天涯”。这样所有来自天涯论坛的邮件都会自动加上“天涯”标签。

我从文章“关于Gmail你可能不知道的8件事”挑出来以上两个功能,个人认为比较有用哦!

Posted by 王永杰 in 网络应用 - Comments (0)
25 03月

解析命令行参数规则 (Parsing C Command-Line Arguments)

这里说的解析命令行参数,并不是说类似getopt的解析函数,而是说win平台的命令行参数是按什么规则传入程序的。前两天我写了个命令行的程序,程序对根目录的处理总是有问题。经过跟踪,发现当输入参数是(”D:\”)的时候,实际程序读到的参数是(D:”)。在路径的两端加上引号,是为了让路径名称中出现空格的时候不会作为参数分隔符处理。可是显然最后一个引号被\转移为 ” 了。

求助于MSDN,终于找到了命令行解析的规则,原文链接:http://msdn2.microsoft.com/en-us/library/aa243471.aspx。这里我做一下翻译:

  • 参数用空格或者TAB进行分割。
  • 一个字符串若被两个双引号包含,则即使其中包含空格或TAB字符也会被视为一个参数。被引起来的字符串可以嵌入参数内。
  • 字符串中存在的双引号可以通过前置反斜杠进行转义。
  • 反斜杠会被解释成单个字符,除非后面紧接着一个双引号。
  • 如果偶数个反斜杠后面跟随一个双引号,每对反斜杠放一个反斜杠到参数中,双引号被解释为一个字符串界定符。
  • 如果奇数个反斜杠后面跟随一个双引号,每对反斜杠放一个反斜杠到argv数组中,双引号则被剩下的反斜杠转义放入到argv中,而不会作文字符串界定符。

这里有几个例子,一看就明白了:

Command-Line Input argv[1] argv[2] argv[3]
“a b c” d e a b c d e
“ab\”c” “\\” d ab”c \ d
a\\\b d”e f”g h a\\\b de fg h
a\\\”b c d a\”b c d
a\\\\”b c” d e a\\b c d e
Posted by 王永杰 in C&C++, 技术为本 - Comments (0)
31 01月

在UltraEdit中使用正则表达式

引自:http://dev.csdn.net/article/84/84807.shtm

UE的正则表达式语法 (UltraEdit Syntax)

  • % 匹配行首 - 表明要搜索的字符串一定在行首.
  • $ 匹配行尾 - 表明要搜索的字符串一定在行尾
  • ? 匹配除换行符外的任一单个字符.
  • * 匹配任意个数的字符出现任意次数(不包括换行符)
  • + 匹配前导字符或者表达式出现一次或者更多次(不包括换行符)
  • ++ 匹配前导字符或者表达式不出现或者出现一次以上(不包括换行符)
  • ^b 匹配页中断符
  • ^p 匹配DOS文件的换行符
  • ^r 匹配MAC文件的换行符(CR Only)
  • ^n 匹配UNIX文件的换行符 (LF Only)
  • ^t 匹配一个制表符
  • [ ] 匹配方括号中的单个的字符

UE的常用替换语句

  • 删除空行: 替换 %[ ^t]++^p 为 空串
  • 删除行尾空格: 替换 [ ^t]+$ 为 空串
  • 删除行首空格: 替换 %[ ^t]+ 为 空串
  • 每行设置为固定的4个空格开头: 替换 %[ ^t]++^([~ ^t^p]^) 为 ” ^1″
  • 每段设置为固定的4个空格开头: 替换 %[ ^t]+ 为 ” ”
    • (如果一行是以空格开始的,则视之为一段的开始行)
  • 将一段合并为一行: 替换 [ ^t]++^p^([~ ^t^p]^) 为 ^1
    • (注意: 此处假定文本是以DOS方式回车换行 - CR/LF)
  • 去掉HTML TAG: 替换 ^{<*>^}^{<*^p*>^} 为 空串
  • 删除HTML中的所有<A>: 替换 <[ ]++a *[ ]++href[ ]++=*> 为 空串
  • 删除文本中指定的前2列字符: 替换 %?? 为 空串
  • 在第4列后插入2列空白字符: 替换 %^(????^)^(?^) 为 “^1 ^2″
  • 查找所有的数字: [0-9]+[.]++[0-9]+
  • 查找所有的单词: [a-z]+
  • 查找所有的网址: http://[a-z0-9^~`_./^-^?=&]+
  • 注意: 替换的时候需要勾选使用正则表达式选项
Posted by 王永杰 in 技术为本, 文摘转贴 - Tags: - Comments (0)
30 01月

用手机当猫通过GPRS拨号上网

优点

  1. 方便:只需要手机和数据线即可,手机有信号的地方就可以上网,回到老家也可以啦,呵呵。
  2. 便宜:便宜是相对来说的,只要不进行下载或者图片视频浏览,而且也只是偶尔才用一下,那是用不了多少的。俺在北京,5元包10M流量,包括了cmnet和cmwap。
  3. 漫游:漫游不需要花钱哦,像随意行之类漫游都是需要额外收费的,或者有少量的赠送。

缺点

  1. 价格贵:矛盾了,呵呵,5元才10M,一不小心就会超掉哦,超出的部分1分钱/1k流量,10M就是100块钱,很可观的哦。俺有一次没包月的情况下用了1.8M,近50块钱就没了,心疼……
  2. 网速慢:信号好也就10k/s,想下载东西,甭想啦,多打开些网页都不行。
  3. 不稳定:偶尔会掉线,和手机信号有很大关系的。

总的来说如果只是偶尔在没有宽带的地方收发邮件、看看新闻等,10M也已经足够消费了。

设置步骤

俺用的是黑莓手机7100T,笔记本的系统是英文版的XP,用黑莓手机上网的步骤如下:

  1. 修改Standard Modem的属性
    • 打开Extra Settings,在Extra initialization commands输入框内填入 at+cgdcont=1,”ip”,”cmnet” ,保存。
    • 路径是:Control Panel -> Phone and Modem Options -> Modems -> Standard Modem -> Properties -> Advanced -> Extra Settings。
  2. 创建网络连接,由Network Connections 进入 New Connection Wizard,接着根据提示一步步进行如下选择:
    1. Connect to the Internet.
    2. Set up my connection manually.
    3. Connect using a dial-up modem.
    4. Select a Device.
    5. Connection Name, ISP Name = BlackBerry
    6. Phone Number to Dial, Phone number = *99***1#
    7. Connection Availability, I choose Anyone’s use.
    8. Internet Acount Infromation, User name is cmnet and password left empty, don’t make it as the default internet connection.

  • 错误718:是因为Distributed Link Tracking Client 服务没有启动,启动之后即可消除。

参考资料

Posted by 王永杰 in 网络应用 - Comments (0)
14 01月