MFC"无法更新程序数据库"解决方案

MFC项目有时候会碰到这个问题:
error C2471: 无法更新程序数据库 ......
fatal error C1083: 无法打开程序数据文件:......
通常是粘贴复制代码的时候少做了某些操作导致pdb更新失败.
删掉项目目录下, Debug/Release里的 *.pdb文件重新编译即可发现问题的根源.
网上说该C7兼容之类的, 治标不治本.

VS编译时断点无法命中解决方案

VS MFC编译的时候又是会碰到:
当前不会命中断点. 此位置当前尚未加载可执行代码.
碰到此问题, 多半是由于文本格式不匹配导致, 我总结的解决方案:
1. 运气好的话选中有问题的文本, [编辑]-->[高级]-->[设定选定内容的格式], 然后重新编译即可解决
2. 如果设定格式未能解决, 看一下有问题的代码是不是有注释之类在行与行之间. 例如:
printf("%d,%d,%d",
	a,	//测试1
	b,	//测试2
	c);	//测试3
将代码重写一下, 注释和换行都去掉
printf("%d,%d,%d",a,b,c);
不出意外可以解决
3. 如果还是未能解决, 只能用杀手锏了, 将有问题的文件文本复制粘贴到一个新建的文本中, 删掉原来有问题的文件, 重新建一个同名的, 将内容粘贴进去, 或者重新手敲一遍.
手敲效果更佳, 尤其是有问题的位置, 最好手敲.
    

MFC 获取 WinCE 电量

引用头文件
#include <WinBase.h>
对于VS等工程, stdafx.h 中或许已经包含了该文件
PS. 定义的时候或许VS不能自动识别, 但用无妨.
PS. CE SDK要包含该头文件及相应的库


需要用到的函数及结构体
函数 : v()

简单的十进制123转十六进制0x123,字符串比数字转换慢10倍

环境VC
这不是十进制转十六进制.... 十进制和十六进制是不需要转换, 但是有时会用到十进制数当成十六进制数来进行计算.
例如十进制的123当成0x123来使用.
吾的做法有两种, 1.十进制数格式化输出成字符串, 然后字符串格式化输入成十六进制数; 2.十进制数除以10取余,余数乘16的(位数-1)次方, 商继续除以10直到为0.

CE的一次内存检漏

最近做的CE项目有个问题, 程序跑一段时间就白屏.
用各种工具看了半天也没发现内存有涨, 但是出这状况一般是内存泄露之类, 程序能跑是没什么问题.
于是压力测试, 最终发现停止刷新界面的话不会白屏, 一旦刷新次数过多就会白屏.
内存泄露锁定在重绘的地方, OnPaint()函数中

MFC自定义控件(Custom Control)使用

吾用的是VS2008,注意几点.
1.必须为Custom Control控件指定一个已经存在的类.
2.必须有RegisterCtrlClass()函数来注册这个控件类.
3.控件对象必须关联该类,即DDX_Control(pDX, IDC_XXX, xxx);

MFC中处理消息的顺序

MFC应用程序中处理消息的顺序

1.AfxWndProc()           该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc

2.AfxCallWndProc()  该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数

3.WindowProc()        该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数

4.OnWndMsg()         该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数

5.OnCommand()       该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数

6.OnCmdMsg()            根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数

setsockopt 设置socket 详细用法

1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:
BOOL bReuseaddr=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));

2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历
TIME_WAIT的过程:
BOOL bDontLinger = FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));

3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
int nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收时限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));

WinCE LED控制

LED控制事实上就是控制设备管脚电平高低, 所控制的设备未必一定是LED灯.
用到的两个函数:NLedGetDeviceInfo(),NLedSetDevice().
用到的结构体:NLED_SETTINGS_INFO.

NLedGetDeviceInfo()原型:
BOOL WINAPI NLedGetDeviceInfo(
  UINT nInfoId,
  void* pOutput
);
其中参数 nInfoId 的取值决定了参数 pOutput 的返回值类型.
NLedGetDeviceInfo
nInfoId取值pOutput类型说明
NLED_COUNT_INFO_IDNLED_COUNT_INFO指定pOutput数据为设备上LED的数量
NLED_SUPPORTS_INFO_IDNLED_SUPPORTS_INFO指定pOutput数据为LED支持的能力信息
NLED_SETTINGS_INFO_IDNLED_SETTINGS_INFO指定pOutput数据为LED电流设置信息