我现在在做的一个是需要在dll中使用到cmscomm,而cmscomm控件需要有dialog才能生存。请问各位大虾有无这方面经验!

解决方案 »

  1.   

    从CWnd继承一个类,在里面加入cmscomm控件,及操作代码,要在dll里面生成这个类的实例就可以了。我以前做过,好像是这么做的
      

  2.   

    那么 怎么把cmscomm控件拖放到这个类里面呢?普通的cmscomm可都是放在一个dialog面板里的呀!
    还有我已经在调用这个dll的mfc 项目程序里使用了cmscomm控件,这个cmscomm和在dll里面的那个有影响吗????
    谢谢!
      

  3.   

    应该没有影响。具体做法你参考一下VC技术内幕第四版里的有关AtiveX的用法
    或者你新建一个dialog然后放一个cmscomm控件,然后查看那个dialog类的代码,把classwizard自动添加的代码复制到你的类里面就OK了
      

  4.   

    在我的dll里,我继承cdialog建立一个cxx类,然后在cxx里面放置了cmscomm控件.在cxx.h里定义了 CMSComm m_ctrlComm;  在CTR_DLL.cpp里面使用到m_ctrlComm.SetOutput(COleVariant(array));
    cxx.cpp:
    __________________________________________________CXx::CXx(CWnd* pParent /*=NULL*/)
    : CDialog(CXx::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CXx)
    //}}AFX_DATA_INIT
        if(m_ctrlComm.GetPortOpen())
        m_ctrlComm.SetPortOpen(FALSE);
        m_ctrlComm.SetCommPort(1); //选择com1
        if(!m_ctrlComm.GetPortOpen())
        m_ctrlComm.SetPortOpen(TRUE);//打开串口
         else
        AfxMessageBox("cannot open serial port");
        m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位 
        m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
        m_ctrlComm.SetRThreshold(1); 
    /////////参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
        m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
        m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
        m_ctrlComm.SetOutBufferCount(0);
      // Place all significant initialization in InitInstance
    }
    void CXx::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CXx)
    DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);
    //}}AFX_DATA_MAP
    }
    BEGIN_MESSAGE_MAP(CXx, CDialog)
    //{{AFX_MSG_MAP(CXx)
    // NOTE: the ClassWizard will add message map macros here
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    但是程序一执行到m_ctrlComm.xxxxxx就出致命错。大虾救命啊!!!!!!!!!!
      

  5.   

    谢谢 !:-)
    [email protected]