Visual Studio MFC编程 程序调试时所遇到的问题及解决方法

本文详细记录了在Visual Studio MFC编程过程中遇到的各种问题,包括快捷方式、网络通讯、字符类型转换、错误处理、控件操作等方面,并提供了相应的解决方法。例如,如何快速编译生成exe、代码自动排版、两台电脑间网络通讯、WSAGetLastError返回0的处理、成员跨类使用、MFC对话框最大化时控件比例调整等。每个问题都附有具体的解决方案和参考资料。
摘要由CSDN通过智能技术生成

本文中记录了笔者在基于Visual Studio MFC编程时, 程序调试过程中所遇到的问题及解决方法。

目录

1、Visual Studio MFC中的快捷方式

1.1、问题:Visual Studio MFC中修改好程序之后,怎样编译并建立可运行的exe

1.2、问题:Visual Studio的代码怎么快捷排版/自动排版/代码行自动对齐?

2、问题:怎样实现两台电脑之间的网络通讯(20171123YC)

3、问题:Rich Edit 2.0 Control相关

4、问题:字符类型转换故障

5、问题:WSAGetLastError返回0

6、问题:以太网连接若出现故障则程序卡死

7、问题:成员的跨类使用

8、问题:编译时无报错,而运行时产生如下报错

9、问题:C++中定时器的使用方法记录

10、问题:C++中测量某一段代码的运行时间的方法

11、问题:C++建立并写入.txt文件的方法

12、问题:C++创建文件夹和子文件夹的方法

13、问题:C++中怎么将CString赋值给char数组

14、问题:C++中怎么将char转化为CString

15、问题:VS2012中32位和64位之间编译的转换问题

16、问题:Debug Assertion Failed!

17、问题:怎样使得VC++对话框大小不可调

18、问题:怎样使得VC++对话框最大化 / 最小化

19、问题:Visual Studio MFC中修改STATIC的文本颜色和文本字体等

20、问题:VC++串口通讯怎么以HEX格式通讯 20170921YC

21、问题:VS怎么加快编译速度?

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 资源在另一个编辑器中打开 怎么回事?

34、问题:radio button怎样设置为默认选中?

35、问题:文件打开和保存时,路径、文件名的选择

36、问题:在其它电脑上,exe双击之后或程序编译运行之后,程序不运行也无报错。(20171226)

37、问题:USB接口无反应

38、问题:Visual Assist X插件安装

39、问题:彻底解决COM端口被占用(在使用中)问题的办法

40、问题:MFC Radio Button 使用 分组 RadioButton 用法

41、问题:怎样让VC自动关闭弹出的MessageBox对话框

42、问题:MFC怎样截获界面最大化最小化按钮的处理

43、问题:使MFC对话框不响应标题栏双击

44、问题:MFC获取系统当前时间

45、MFC的对话框的密码登录

46、C++中怎样将double转化成字符串

 


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

C++ Socket超时设置

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);

下面就可以进行正常的recvsend操作了。

顺便记录下,多网卡发送数据的操作。

当客户端去主动连接服务端的时候(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

  • 1
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值