本文中记录了笔者在基于Visual Studio MFC编程时, 程序调试过程中所遇到的问题及解决方法。
目录
1.1、问题:Visual Studio MFC中修改好程序之后,怎样编译并建立可运行的exe
1.2、问题:Visual Studio的代码怎么快捷排版/自动排版/代码行自动对齐?
2、问题:怎样实现两台电脑之间的网络通讯(20171123YC)
19、问题:Visual Studio MFC中修改STATIC的文本颜色和文本字体等
20、问题:VC++串口通讯怎么以HEX格式通讯 20170921YC
22、问题:怎样让VS只显示error不显示warning?
23、std::vector的清空,Vector清空数据与释放内存(.clear与.swap的区别与使用)
24、c++ vector(向量)使用方法详解(顺序访问vector的多种方式)
25、问题:怎样让工控机一上电就自动运行某程序?(20171113YC)
26、问题:基于对话框的MFC怎样不按按钮自动运行该按钮的响应函数?(20171113YC)
27、问题:MFC鼠标滚轮消息WM_MOUSEWHEEL失灵
28、问题:在对话框最小化之后恢复对话框显示,此时怎样执行响应函数
29、问题:怎样获取MFC对话框中某一控件的位置(在对话框中的坐标)
30、问题:怎样实现MFC对话框最大化时控件也随比例最大化或者还原
31、问题:error C2061 语法错误: 标识符“CMy3DLaserApp1Dlg …… 注意: C++ 不支持默认 int
32、问题:怎样实现VS2010生成的.exe在其他电脑运(20171127YC)
33、问题:vs2010 资源在另一个编辑器中打开 怎么回事?
36、问题:在其它电脑上,exe双击之后或程序编译运行之后,程序不运行也无报错。(20171226)
40、问题:MFC Radio Button 使用 分组 RadioButton 用法
41、问题:怎样让VC自动关闭弹出的MessageBox对话框
1、Visual Studio MFC中的快捷方式
1.1、问题:Visual Studio MFC中修改好程序之后,怎样编译并建立可运行的exe
Ctrl+F5两个按钮同时按下。
1.2、问题:Visual Studio的代码怎么快捷排版/自动排版/代码行自动对齐?
在代码页面,Ctrl+A,全选代码,之后分别:Ctrl+K、Ctrl+F,即可实现自动排版。
或者采用另一种方式:Ctrl+A,Alt+F8,即可实现。
……………………………………………………………………………………………………………………………………………
2、问题:怎样实现两台电脑之间的网络通讯(20171123YC)
1)、用网线连接两台电脑
2)、在两台电脑的“打开网络和共享中心”→“更改适配器设置”中均应该是如下状态:
IP地址:设置成最后一位不一样的
3)、在两台电脑上打开“网络调试助手”(可网上下载),协议类型分别是server和client,两边的IP都设置成和服务器server一致,端口号设置成一样的。
4)、连接正常的现象:两端能正常互相传输信息即可。
5)、如果连接有问题,可尝试以下操作:
①更改端口号;
②服务器和客户端反向,也即两台电脑配置颠倒一下试一试。20171123采用这个办法解决了两台电脑无法网络通讯的问题。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
怎样实现2个网络调试助手的通信?
使2个网络调试助手之间建立通信,以方便调试:
1、两台电脑用网线连接。确保网线两端的连接有效。
2、电脑1的设置:
①
②
→右键,属性
③
双击
④
网络配置成上述那样,之后确定。
3、电脑1上打开如下软件:
软件的参数配置如下:
协议类型:TCP Server(应先配置服务器);本地IP地址:和刚才在“网络和共享中心”中配置的一致;本地端口号:如果配置成8080则无法连接,最后配置成了8081方可连接。
4、之后就可以进行连接,连接成功后如下图所示:
5、电脑2上:
“网络和共享中心”中配置IP地址为:192.168.1.90,也即和电脑1的192.168.1.91在最后一位有区别即可。
6、在电脑2上打开如下软件:
软件的参数配置如下:
协议类型:TCP Client
服务器IP地址:192.168.1.91(和电脑1保持一致)
服务器端口:8081(和电脑1保持一致)
之后就可以进行连接。
(客户端Client的连接应该是在服务器Server之后。)
7、服务器连接成功之后,就可以进行电脑1和电脑2之间的网络通信。
……………………………………………………………………………………………………………………………………………
3、问题:Rich Edit 2.0 Control相关
一个基于Dialog的对话框,放入一个Rich Edit 2.0 Control,(其他都不作改动)对话框就不显示了呢?
http://bbs.csdn.net/topics/20383900
http://blog.csdn.net/wuhenyouyuyouyu/article/details/40422247
解决办法:
Caution If you are using a rich edit control in a dialog box (regardless whether your application is SDI, MDI, or dialog-based), you must call AfxInitRichEdit once before the dialog box is displayed. A typical place to call this function is in your program's InitInstance member function. You do not need to call it for each time you display the dialog box, only the first time. You do not have to call AfxInitRichEdit if you are working with CRichEditView.
也即在CMyApp::InitInstance()中加上这条语句
AfxInitRichEdit();
【YC:注意:应该在C<工程名>App::InitInstance()中的最前面加上上述语句。】
今天遇到这个问题,特此记录!
总结:对于子对话框中运用rich-edit control控件的情况,应该在主对话框对应的.cpp(注意,不是Dlg.cpp)文件的InitInstance()函数的开头处添加语句:AfxInitRichEdit();
……………………………………………………………………………………………………………………………………………
4、问题:字符类型转换故障
报错:不能将参数 1 从“LPTSTR”转换为“char *”与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换
http://www.aiuxian.com/article/p-1257009.html
……………………………………………………………………………………………………………………………………………
5、问题:WSAGetLastError返回0
WSAGetLastError返回0
最近使用wince开发的socket连接公网IP,发现一些情况下调用WSAGetLastError返回的结果为0,而0是socket正常的标志,而明明SOCKET_ERROR == nRet了,具体发现一部分调用返回10065之类的,而一部分返回0.后终于找到原因:int err=WSAGetLastError();的调用必须放到其他系统函数调用之前,也就是说,出现错误后,第一时间存储WSAGetLastError结果,而不能调用其他函数之后再调用此函数。因为调用系统函数会清除WSAGetLastError,致使结果返回0.
http://blog.csdn.net/tianbaowen/article/details/8485567
……………………………………………………………………………………………………………………………………………
6、问题:以太网连接若出现故障则程序卡死
网络连接不顺利则程序卡死。需要有网络连接延时判断,连接超时则报错,从而保证程序的鲁棒性。
参考链接:
http://www.cnblogs.com/gaoteng/p/3767967.html
用winsocket时,send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,可以设置收发时限:
int nNetTimeout = 1000; //1秒
//发送时限
setsockopt( socket, SOL_SOCKET, SO_SNDTIMEO, ( char * )&nNetTimeout, sizeof( int ) );
//接收时限
setsockopt( socket, SOL_SOCKET, SO_RCVTIMEO, ( char * )&nNetTimeout, sizeof( int ) );
但是当我们的客户端通过connect 函数连接服务端时,这时超时时间很长,那我们应该如何设置connect的超时时间呢?
查资料后发现,select方法可以查询socket套接字的状态。
fd_set rfd; //描述符集 这个将测试连接是否可用
struct timeval timeout; //时间结构体
FD_ZERO($rfd);//先清空一个描述符集
timeout.tv_sec = 60;//秒
timeout.tv_usec = 0;//一百万分之一秒,微秒
u_long ul=1;//代表非阻塞
ioctlsocket(socket,FIONBIO,$ul);//设置为非阻塞连接
下面开始进行connect
connect(socket,(SOCKADDR*)&addrClient,sizeof(SOCKADDR))
FD_SET(sock,&rfd);
连接之后将socket添加到描述符rfb中,这样就可以对这个socket进行测试了。一个描述符可以添加多个socket
下面执行select函数,进行查询
ret = select(0, 0, &rfd, 0, &timeout);
if(ret<=0)
{
说明超时,仍然没有连接成功
然后可以在程序中做相应的处理
}
如果在超时时间之内连接成功
则将socket重新设置为阻塞状态
如下
ul = 0;
ioctlsocket(socket,FIONBIO,&ul);
下面就可以进行正常的recv与send操作了。
顺便记录下,多网卡发送数据的操作。
当客户端去主动连接服务端的时候(TCP),默认是不需要指定,本地的ip与端口的,操作系统会自动给你分配端口,然后根据路由自动选择出口。
但是当你想主动根据不同的数据去选择不同的网卡发送时,我们应该怎么做呢。
答案很简单,
SOCKADDR_IN addrSelf;//本地地址
addrSelf.sin_addr.s_addr = inet_addr("192.168.1.110");//指定网卡的地址
addrSelf.sin_family = AF_INET; addrSelf.sin_port = htons(20000);//本地端口
if( -1 == bind(sockClient[i],(SOCKADDR*)&addrSelf,sizeof(SOCKADDR)))//把网卡地址强行绑定到Soket
{
绑定成功
}
YC:在激光雷达网络通讯程序中,调通的代码记录如下:(在TCPSocket.cpp中)
//↓↓//
fd_set rfd;//描述符集 这个将测试连接是否可用
struct timeval timeout; //时间结构体
FD_ZERO(&rfd);//先清空一个描述符集
timeout.tv_sec = 2;//秒 (延时时间)
timeout.tv_usec = 0;//一百万分之一秒,微秒 (延时时间)
u_long ul=1;//代表非阻塞
ioctlsocket(m_sSocket,FIONBIO,&ul);//将socket置为非阻塞模式;
//↑↑// 20170628YC
if(connect(m_sSocket,(LPSOCKADDR)&server,sizeof(SOCKADDR))==SOCKET_ERROR)
{
error=WSAGetLastError();
if(error==EINPROGRESS) //错误码如果是EINPROGRESS,那说明connect还在继续
{
;
}
else
{
//↓↓//
int result;
FD_SET(m_sSocket,&rfd);
result = select(0, 0, &rfd, 0, &timeout); //设置延时时间限制。
if(0==result) //超时
{
error=WSAGetLastError();
/*
→ “int err=WSAGetLastError();”的调用必须放到其他系统函数调用之前,
也就是说,出现错误后,第一时间存储WSAGetLastError结果,
而不能调用其他函数之后再调用此函数。因为调用系统函数会清除WSAGetLastError,
致使结果返回0。
*/
AfxMessageBox("报错:网络连接超时!");
closesocket(m_sSocket);
m_sSocket=NULL;
return FALSE;
}
else