首先,我恳请高手支招,如需要,请留下邮件,我可以将代码发去研究。
另外,由于我的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!!!救命!!!!!!!!!!
另外,由于我的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!!!救命!!!!!!!!!!
我需要的是如何操作
还想弄明白一个自己糊涂的地方: 非窗口类成员如何得到父对象的指针?比如父窗口...
汗....
这个问题我都不好意思问了,我觉得我上班上傻了
this article create a control which would behave as a dialog.then you use your socket class.
[email protected]
如果是:
将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类,实现其方法,事件
这个工程是我在前面尝试了几次不同方法后重开的,很多东西都少了...
另外还有一个客户端的数据接收线程的~~唉
我看晕头了要
你将你的工作按功能分成几大块,然后分别解决.思路一定要清析!
祝好运!
我现在遇到了新的问题,正在调试中...满头大汗....
我是钻了死胡同,越钻越迷糊问题已解决,结贴
具体方案如下: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的指针,其他地方都没有用到,免得麻烦
而且层次比较清楚,看得不糊涂,希望这个问题的解决过程对大家有帮助