利用API实现通讯,可以使VBA利用有个本质的突破,不需要另拷SOCKET控件,程序发布非常简单。我能想到的功能,如抢答竞赛、网上考试、网上民主评议、网上打分等。本人2016年10月单位有一个竞赛,有抢答和必答,想通过通讯在VBA实现。07年使用易语言实现,画面、时钟、出题逻辑、分数计算VBA都能实现,VBA难点主要是通讯。 经过一个多月的网上学习,利用EXCEL和WORD的VBA,编写SOCKET套接字通讯API的模块,使用异步选择模式WSAAsyncSelect,使用SetWindowLong函数设置接收以WINDOWS消息的网络事件。 按照网上专家大侠们的观点异步选择模式一个线程可接64个客户端,不知道VBA能接多少。网上多数大侠认为VBA不能处理多线程,但网上也有VBA处理多线程的例程,我理解都是处理相对简单的内容,不能与sheetst和cells发生关系,否则则系统崩溃。使用SetWindowLong函数处理WINDOWS消息,也不能与sheetst和cells发生关系,否则系统崩溃,注:曾看过网上说ECXEL处理超过一定时间不再响应机制,可能与此有关。线程和消息处理与窗体及窗体控件发生关系不受影响。因此可通过控件再与sheetst和cells发生关系,不知此观点是否正确。我知道能回调程序的函数有Application.OnTime,SetWindowLong,钩子函数等,在VBA里回调程序也经常崩溃,需要各位大侠总结一下。
目前在本机测试(IP地址127.0.0.1用于本机测试的地址),WINDOWS消息处理正确(不死机),服务端与客户端连接已能相通,但服务端发送的信息,客户端也能收到FD_READ事件,但客户端使用RECV函数取回信息时,出现FD_CLOSE事件(服务端和客户端同时出现,可能是本机测试),并报10053错误。本人对BYTE数据类型处理不太懂。
请各位大侠帮助调试:1。最主要的是解决调用RECV函数出现的FD_CLOSE事件,报10053错误。2。解决关闭套接字端口closesocket(s),又何再调用,因为除非退出EXCEL、WORD外,再调用报-1错误。3.发布一个最优的VBA的API通讯案例。
废话不再说了,直接上程序。见附件。
还的啰嗦几句,excel和word的VBA程序是一致的,为了在本机测试方便,服务端可以有使用excel,客户端使用WORD。
|