首先,我恳请高手支招,如需要,请留下邮件,我可以将代码发去研究。
另外,由于我的ActiveX实在是一点都不通,只按着一些资料上的简单步骤添加了属性和方法...还不知道添对了没....问题如下:
我需要一个ActiveX嵌入IE,和某服务器上的我写的服务应用程序通信。
首先我的想法就是在CMyActiveCtrl类中加入我的 CMySocketClient类成员变量。SocketClient类包含了winsock.h(由于在ActiveX工程中编译出错,被我替换成了afxsock.h),他的发送和接受均由 send/resv函数实现。
该SocketClient类的Send函数发出的消息,服务器能接收到,并按我的设计当接受到消息时向该ActiveX发送回应内容。该socket类的收发功能均正常,我在专门另开的一个测试工程中调试过了,并且又另开了一个该ActiveX的容器工程测试过,也能收到回应。
问题出在我对“服务器回应”的处理上:我开始的想法是当socket接收到服务器回应时,将内容及时显示在ActiveX的界面上,于是我就在接收到服务器回应时用 ::PostMessage函数向CMyActiveXCtrl对象发出一个自定义的消息,PostMessage的参数中,句柄我是在CMyActiveXCtrl的构造中得到this指针,再this->m_hWnd得到的(此处可能有点问题,因为我是将得到的hWnd保存到一个全局外部变量HWND hWndDlg中,在使用时声明了一下  extern HWND hWndDlg...都不知道这语法对不对,一时给忘了),但是我发现该方法行不通,也不知道是没有收到服务器返回的数据,还是该消息根本没被触发,还是ActiveX根本不支持我这种照搬自MFC程序的自定义消息方式
(我就是添加了 ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam) ;
)这两句,并实现了该响应函数.
在这个方法不行后,我又想到另一种方法,在ActiveX中插入一个对话框,生成CMyActiveDlg类后,在该类中使用CMySocketClient做为成员,然后又将该对话框做为ActiveXCtrl的类成员。然后在ActiveX的方法中调用该对话框的Socket成员方法...,在测试工程中,发送数据完全正常,但好像根本没有接收到服务器返回的数据....我也不知道在socketClient收到数据后该如何对它的父对象也就是对话框进行操作,因为我一时犯傻,根本不知道怎么得到对话框的指针句柄什么的。
写了这么多,高手一定请花一点时间帮我分析分析
现在ActiveX的教程实在太少了,即使有,也很少有系统点的实例,比如响应自定义消息,包含其他对象比如对话框框架视图等等并对它们进行操作的。
先谢过!!!!!!
Help!!!救命!!!!!!!!!!

解决方案 »

  1.   

    http://www.codeguru.com/activex/dialogctrl.shtml
      

  2.   

    另外我要申明的是,我这个Active工程中,能够正常显示我用到的Dialog
    我需要的是如何操作
    还想弄明白一个自己糊涂的地方: 非窗口类成员如何得到父对象的指针?比如父窗口...
    汗....
    这个问题我都不好意思问了,我觉得我上班上傻了
      

  3.   

    http://www.codeguru.com/activex/dialogctrl.shtml
    this article create a control which would behave as a dialog.then you use your socket class.
      

  4.   

    让我试试(不过你要等,因为你知道,大家都有事)
    [email protected]
      

  5.   

    [email protected]代码发给我看看。
      

  6.   

    你是不是要在对话框中显示接收到的内容?
    如果是:
    将m_P3Dlg设为全局变量(否则在线程中不好调用)
        DWORD WINAPI ThreadProc(LPVOID lpParameter)
    {
    char ch[200];
    CString str;
    m_P3Dlg.m_sockClient.ConnectServer("127.0.0.1", 3344) ;
    m_P3Dlg.m_sockClient.SendMsg_C("Hellow");
    while(1)
    {
    Sleep(1);
    try
    {
    if(0==m_P3Dlg.m_sockClient.ReceiveMsg_C (ch))
    {
    str.Format ("%s",ch);
    ::SetDlgItemText(m_P3Dlg.m_hWnd,IDC_STATIC1,str);
    m_P3Dlg.m_sockClient.SendMsg_C("Hellow");
    }
    }
    catch(...)
    {
    }
    }
    return 0;
    }
    void CMISP3ctrlCtrl::SetPszServerIP(LPCTSTR lpszNewValue) 
    {
    // TODO: Add your property handler here
    char * pszIP = (char *)lpszNewValue ;
    m_strServerIP = CString(pszIP) ;
    //m_P3Dlg.m_sockClient.ConnectServer(pszIP, 3344) ;//将调用放到线程中
    DWORD threadID=0;
    HANDLE hThread=CreateThread(\
    NULL,  // pointer to security attributes
    0,                         // initial thread stack size
    ThreadProc,     // pointer to thread function
    NULL,//&m_strServerIP ,   // argument for new thread
    0,              // creation flags
    &threadID       // pointer to receive thread ID
    );
    CloseHandle(hThread);
    SetModifiedFlag();
    }还有你的int CSocketBlockClient::ReceiveMsg_C(char *buff)需要修改,我在调试时发现接收到的字符串前面少了几个字母!!!!!!!!根源:
        你原来的程序中没有接收内容!!!!,ReceiveMsg_C只是一个函数,不是事件,它不会自动去接收的.我这样改也不是太好,只是在你原来的基础上实现接收和显示而已.
    你最好参考上面,重新写CMySocket类,实现其方法,事件
      

  7.   

    CSocketBlockClient::ReceiveMsg_C(char *buff) 少收到字符吗?
    这个工程是我在前面尝试了几次不同方法后重开的,很多东西都少了...
    另外还有一个客户端的数据接收线程的~~唉
    我看晕头了要
      

  8.   

    CSocketBlockClient::ReceiveMsg_C(char *buff)不是少收,可能里面的处理有问题(我没去详细研究).我从服务端发一个"this is a test",结果接收后前面好像是少了两个还是多少(肯定少了)后面正常.变成了"is a test"
    你将你的工作按功能分成几大块,然后分别解决.思路一定要清析!
    祝好运!
      

  9.   

    有什么难的啊?发给我看看,[email protected]
      

  10.   

    哦~~我就说呢,那是服务器的处理,由于你的服务器端是自己写的,跟我的不同,所以才出现这种情况的。 比如我发送"This is",在服务器器端就会变成“XX___This is",XX是数据长度,前5位如果不够长则补空格。多谢 xhzxlqt(人这一辈子)兄弟的关注! 
    我现在遇到了新的问题,正在调试中...满头大汗....
      

  11.   

    楼上的,是啊,的确没什么复杂的,关键是当时想没想通的问题
    我是钻了死胡同,越钻越迷糊问题已解决,结贴
    具体方案如下:ActiveX工程中引入Dialog(论坛里有很多有关内容,不过都是照翻国外的,唉)
    CActiveXDialg类中定义与服务器通信的CSocketClient类成员m_SocketClient,并设置对话框的两个成员函数SetServerIP和SetProjectName.
    SetServerIP(LPTSTR pszNew)
    {
        m_SocketClient.ConnectServer(pszNew) ; //大致表达一下意思,写的不规范
        ::AfxBeginTheard(接受线程,this) ;  //在接受线程里有dialog的指针,对对话框操作(接收消息并显示
    }
    SetProjectName(LPTSTR pszNEW) //其实就是向服务器发送数据的函数
    {
        m_SocketClient.SendMsg_C(pszNew) ; //大致表达一下意思,写的不规范
    }
    }
    CActiveXCtrl类中定义CActiveXDialog成员,再定义两个接口方法SetIP和SetName,用来调用对话框的成员函数。
    比如
    CActiveXCtrl::SetIP(LPTSTR newVar)
    {
       m_Dialog.SetServerIP("127.0.0.1") ;
       ...
    }....除了在线程中,定义了CDialog的指针,其他地方都没有用到,免得麻烦
    而且层次比较清楚,看得不糊涂,希望这个问题的解决过程对大家有帮助