ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:238.87KB ,
资源ID:4344303      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4344303.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(标准MFC WinSock ActiveX控件开发实例.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

标准MFC WinSock ActiveX控件开发实例.docx

1、标准MFC WinSock ActiveX控件开发实例摘要:本文主要介绍如何开发一个ActiveX控件,提供接口,与相应事件挂钩。文中涉及到VARIANT,SAFEARRAY,BSTR的详细使用方法。另外还提供了WinSock的详细开发步骤,以及如何响应网络超时,网络断开的事件方法以及在VC,VB调用该控件的方法。关键字:ActiveX,Socket,VARIANT, SAFEARRAY,BSTR。一、MFC ActiveX控件开发步骤(VC 6.0):1. New-Projects-MFC ActiveX ControlWizard,然后输入MFCWinSock工程名。如下图:图一 创建工程

2、2. 一路狂按Next,直至Finsh出现,再按下OK,如下图:图二 创建完成二、架设Socket环境:1. 首先在StdAfx.h文件中加入下面这句代码: #include / MFC socket extensions 2. 打开MFCWinSock.cpp文件,添加代码,看起来如下:/ CMFCWinSockApp:InitInstance - DLL initializationBOOL CMFCWinSockApp:InitInstance() BOOL bInit = COleControlModule:InitInstance(); if (bInit) / TODO: Add

3、your own module initialization code here. if (!AfxSocketInit() AfxMessageBox(无法初始化Socket,请检查!); return FALSE; WSADATA wsaData; WORD wVersion = MAKEWORD(1, 1);/设定为Winsock 1.1版 int errCode; errCode = WSAStartup(wVersion, &wsaData);/启动Socket服务 if (errCode) AfxMessageBox(无法找到可以使用的 WSOCK32.DLL); return F

4、ALSE; return bInit;/ CMFCWinSockApp:ExitInstance - DLL terminationint CMFCWinSockApp:ExitInstance() / TODO: Add your own module termination code here. WSACleanup();/结束网络服务 return COleControlModule:ExitInstance(); 三,提供控件接口和事件1. 在MFCWinSockCtl.cpp加入如下代码:2. #ifndef WM_MYWINSOCK 3. #define WM_MYWINSOCK

5、WM_USER+18884. #endif 5. View-ClassWizard-Automation-Add Method如下图:图三 创建接口这个时候,我们为这个控件添加了一个Connect()的接口,出于通用性,安全性和扩展性的考虑,我们采用了VARIANT类型的参数,很多人可能都不太了解该类型,又或者有接触过,但被吓怕了,那么我们来看清它的本来面目:6. struct tagVARIANT7. 8. union 9. 10. struct _tagVARIANT11. 12. VARTYPE vt;13. WORD wReserved1;14. WORD wReserved2;15.

6、 WORD wReserved3;16. union 17. 18. LONG lVal;19. BYTE bVal;20. SHORT iVal;21. FLOAT fltVal;22. DOUBLE dblVal;23. VARIANT_BOOL boolVal;24. _VARIANT_BOOL bool;25. SCODE scode;26. CY cyVal;27. DATE date;28. BSTR bstrVal;29. IUnknown _RPC_FAR *punkVal;30. IDispatch _RPC_FAR *pdispVal;31. SAFEARRAY _RPC_

7、FAR *parray;32. BYTE _RPC_FAR *pbVal;33. SHORT _RPC_FAR *piVal;34. LONG _RPC_FAR *plVal;35. FLOAT _RPC_FAR *pfltVal;36. DOUBLE _RPC_FAR *pdblVal;37. VARIANT_BOOL _RPC_FAR *pboolVal;38. _VARIANT_BOOL _RPC_FAR *pbool;39. SCODE _RPC_FAR *pscode;40. CY _RPC_FAR *pcyVal;41. DATE _RPC_FAR *pdate;42. BSTR

8、_RPC_FAR *pbstrVal;43. IUnknown _RPC_FAR *_RPC_FAR *ppunkVal;44. IDispatch _RPC_FAR *_RPC_FAR *ppdispVal;45. SAFEARRAY _RPC_FAR *_RPC_FAR *pparray;46. VARIANT _RPC_FAR *pvarVal;47. PVOID byref;48. CHAR cVal;49. USHORT uiVal;50. ULONG ulVal;51. INT intVal;52. UINT uintVal;53. DECIMAL _RPC_FAR *pdecVa

9、l;54. CHAR _RPC_FAR *pcVal;55. USHORT _RPC_FAR *puiVal;56. ULONG _RPC_FAR *pulVal;57. INT _RPC_FAR *pintVal;58. UINT _RPC_FAR *puintVal;59. struct _tagBRECORD60. 61. PVOID pvRecord;62. IRecordInfo _RPC_FAR *pRecInfo;63. _VARIANT_NAME_4;64. _VARIANT_NAME_3;65. _VARIANT_NAME_2;66. DECIMAL decVal;67. _

10、VARIANT_NAME_1;68. ; 它先是一个结构体,里面有一个重要成员VARTYPE vt;vt即是指明当前的数据类型,比如整型或者字符型,当指明vt后,后面看到各种变量类型包括在一个联合体当中,也就是说指明vt后,你只能使用对应的其中之一变量类型。看着这众多的各种不同类型变量集中在一起,确实让人吓了一跳,但细细看来,大多数变量跟我们平时的用法相似。值得一提的是SAFEARRAY _RPC_FAR *parray;也许有很多人还没有接触过SAFEARRAY类型的变量,SAFEARRAY实际上也是一个结构,大家可以参考MSDN,我也将在后面介绍它的具体使用方法。69. 用同样的方法创建D

11、isConnect()接口70. 创建两个事件,FireCloseWinsock()响应网络断开事件,FireRecvSockEvent()响应网络有数据到达的事件。创建方法如下图:图四 创建事件71. 重载控件消息处理函数WindowProc(),在View-ClassWizard中打开类向导,在消息映射中找到WindowProc,如下图: 图五 重载WindowProc()四、编写代码1. 编写VariantToLong()转换函数,该函数代码如下: 2. /类型转换,将VARIANT类型转换成Long类型3. long CMFCWinSockCtrl:VariantToLong(cons

12、t VARIANT &var)4. 5. long r;6. switch(var.vt)7. 8. case VT_UI2:/USHORT9. r = var.uiVal;10. break;11. case VT_UI4:/ULONG12. r = var.ulVal;13. break;14. case VT_INT:/INT15. r = var.intVal;16. break;17. case VT_UINT:/UINT18. r = var.uintVal;19. break;20. case VT_I4:/LONG21. r = var.lVal;22. break;23. c

13、ase VT_UI1:/BYTE24. r = var.bVal;25. break;26. case VT_I2:/SHORT27. r = var.iVal;28. break;29. case VT_R4:/FLOAT30. r = (long)var.fltVal;31. break;32. case VT_R8:/DOUBLE33. r = (long)var.dblVal;34. break;35. default:36. r = -1;/无法转换该值37. break;38. 39. return r;40. 41. 大家可以看到,该函数将最基本的若干中数据类型转换成了long类

14、型,但VARIANT决不是个简单的谱,我将在后面继续揭开它的神秘面纱.42. 编写我们刚才的接口Connect(),代码代码如下: 在MFCWinSockCtrl.h中加入 43. SOCKET OnlySock;/建立的唯一Socket,不允许重复建立多个44. bool isOnlyConnect;/是否建立了连接 然后再编写Connect(),看起来如下: BOOL CMFCWinSockCtrl:Connect(const VARIANT FAR& RemoteHost, const VARIANT FAR& RemotePort) / TODO: Add your dispatch

15、handler code here if(isOnlyConnect)/该连接已建立,还没有断开 return FALSE; CString IPAddress; int Port;/转换成整型的端口 switch(RemoteHost.vt) case VT_BSTR:/字符串型 IPAddress = CString(RemoteHost.bstrVal); break; case VT_BYREF|VT_I1:/CHAR * IPAddress.Format(%s,RemoteHost.pcVal);/RemoteHost.pbstrVal); break; default: IPAdd

16、ress = ; return FALSE; Port = VariantToLong(RemotePort);/我们编写的一个VARIANT转换成long类型的函数 if(Porth_addr_list); addr.sin_addr.S_un.S_addr = inet_addr(ip); /开始连线 if (connect(OnlySock, (LPSOCKADDR)&addr, sizeof(SOCKADDR) shutdown(OnlySock, 0x02); closesocket(OnlySock);/释放占有的SOCK资源 return FALSE; int iError =

17、WSAAsyncSelect(OnlySock, m_hWnd,WM_MYWINSOCK, FD_READ|FD_CLOSE); /只对网络断开和数据到达通知感兴趣 if(iError = SOCKET_ERROR)/无法绑定Winsock的事件通知 shutdown(OnlySock, 0x02); closesocket(OnlySock);/释放占有的SOCK资源 return FALSE; isOnlyConnect = true; return TRUE; 有必要提一下WSAAsyncSelect(),这里接收网络数据到达和断开的两个消息,我们收到WM_MYWINSOCK消息时将处理

18、该消息并作为事件传送给调用者.第二个参数,窗口句柄,我们传送了m_hWnd,这是因为MFC ActiveX也属于一个窗口,并且是可见的,因此可以成功。45. 编写WindowProc(),代码看起来如下: 46. LRESULT CMFCWinSockCtrl:WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 47. 48. / TODO: Add your specialized code here and/or call the base class49. switch(message)50. 51. case WM_MYWINS

19、OCK:/响应自定义的消息52. switch(WSAGETSELECTEVENT(lParam)53. 54. case FD_READ:/有新数据到达55. FireRecvSockEvent();56. break;57. case FD_CLOSE:/对方已断掉当前连接58. FireCloseWinsock();59. break; 60. 61. break;62. default:63. break;64. 65. return COleControl:WindowProc(message, wParam, lParam);66. 本部分结束语: 好了,现在一个可以运行的控件已经

20、完成,里面提供有Connect()和DisConnect()接口,和RecvSockEvent()及CloseWinsock()事件。以及WinSock的使用方法。在下一部分(高级篇)将讲解两个重要接口SendData()和GetData(),下期内容如下: 1. long SendData(const VARIANT FAR& Data, const VARIANT FAR& DataType,const VARIANT FAR& DataLength, const VARIANT FAR& TimeOut) 2. long GetData(VARIANT FAR* Data, const VARIANT FAR& DataType, const VARIANT FAR& DataMaxLength, const VARIANT FAR& TimeOut) 3. VARIANT和SAFEARRAY的复杂用法。4. 控件开发出来后在VC和VB环境下的使用方法。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1