我用一个ActiveX控件中通信控件来实现对串口操作,我用VC做了一个基于对话框的工程,然后添加了这个通信控件。我的工程名字叫Test,那么在ClassView中可以看到这四个类,CAboutDlg,CTestApp,CTestDlg,CMSComm(是通信控件的类)。因为通信控件是加在对话框上的,那么在CTestDlg里面就有一个CMSComm的对象,对象命名为
m_Comm。
我在CTestDlg的OnInitDialog()函数中初始化控件m_Comm,比如开串口。由于CTestDlg有构造函数,没有析构函数,我就自己写了一个析构函数~CTestDlg()。我本意是想在程序退出的时候要运行这个析构函数,那么我就可以在这个析构函数中处理m_Comm的一些收尾工作,比如关串口。
现在就发现问题了,析构函数~CTestDlg()中的关串口出错。我就设置了端点,发现
到了析构函数里面,m_Comm的值就全零了,也就是说在到析构函数之前,m_Comm就消失了。我很奇怪,就在CTestDlg里面多定义了一个整型变量m_temp,其实m_temp没有实际的用处,但我发现,程序退出时候,m_temp在析构函数~CTestDlg()还有值,也就是说,直到类CTestDlg消失了,m_temp才消失,但为什么m_Comm就不这样呢,m_Comm同样也是类CTestDlg的成员啊。有哪位可以说说,我是新手,呵呵。

解决方案 »

  1.   

    还有,我刚刚发现:
    把m_Comm的初始化放到类CTestDlg的构造函数CTestDlg()里面,它也出现同样的错误,请问这是怎么回事啊?
      

  2.   

    很简单:CTestDlg构造函数运行的时候运行的时候,对话框刚创建,m_Comm对象还没有生成,所以无法正常初始化。(构造函数运行时生成m_Comm对象)。同理,在析构函数运行前,对话框刚收到关闭的消息,m_Comm对象就已经销毁了。所以你在析构函数中看到的全是0。
      

  3.   

    那么我对m_Comm的初始化就放在类CTestDlg的OnInitDialog()函数中吧,那么我想在对话框关闭的时候做m_Comm的收尾工作(比如关串口),但我有不想另外加一个按钮来做m_Comm的收尾工作,因为很多人喜欢直接点击对话框右上角的“小叉”来关闭,请问当点击“小叉”的时候,程序要经过对话框中的哪个函数?(比如说,如果点击对话框的“确定”按钮,那么回发送IDOK的消息出去,那么就可以在IDOK对应的函数中进行相应的操作了)谢谢!