工控编程吧
标题:
338上位机VC MFC获取电脑安装全部协议
[打印本页]
作者:
qq263946146
时间:
2016-9-21 20:57
标题:
338上位机VC MFC获取电脑安装全部协议
(, 下载次数: 1)
上传
点击文件名下载附件
获取电脑安装全部协议
功能展示
一般工控机都自带有TCP/IP等相关通讯协议,没安装相关通讯协议,我们编写的工控通讯软件就无法正常工作,当前例程实现电脑安装的通讯协议检测功能,效果如图,点击<检查电脑安装协议>例程会将系统安装的协议全部罗列在列表框中,事件我们就可根据检测的协议进行下一步操作,如安装无检测到的协议等;
要点提示
例程主要是通过函数WSAEnumProtocols()实现系统安装协议的枚举,此函数可以获取当前系统安装的协议的详细信息;原型如下:
int WSAEnumProtocols ( LPINT lpiProtocols, LPWSAPROTOCOL_INFO lpProtocolBuffer, ILPDWORD lpdwBufferLength );
lpdwProtocols:一个以NULL结尾的协议标识号数组。本参数可选;如果lpdwProtocols为 NULL,则返回所有可用协议的信息,否则的话只返回数组中所开列的协议信息。
lpProtocolBuffer:一个用PROTOCOL_INFO结构填充的缓冲区。参见下文中对PROTOCOL_INFO结构的具体描述。
lpdwBufferLength:输入时,存有传递给WSAEnumProtocols()函数的lpProtocolBuffer缓冲区长度。输出时,表示为获取所有信息需传递给WSAEnumProtocols()函数的缓冲区长度。本函数不能重复调用;传入的缓冲区必须足够大以能存放所有的元素。这个规定降低了该函数的复杂度。由于一个机器上装载的协议数目往往是很小的,所以并不会产生问题。
返回值:
若无错误发生,WSAEnumProtocols()返回协议的数目。否则的话,将返回INVALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取相应的错误代码
错误代码: WSANOTINITIALISED 在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN 网络子系统失效。
WSAEINPROGRESS 一个阻塞WinSock调用正在进行。
WSAEINVAL 参数中有非法值。
WSAENOBUFS 缓冲区太小,无法保存所有PROTOCOL_INFO结构及其相关信息。传入的缓冲区大小至少应等于lpdwBufferLength中返回的值。
实现功能
1.新建基于对话框的应用程序
2.在主对话框头文件包含网络相关函数所在的头文件及库文件#include "winsock2.h"
#pragma comment(lib,“ws2_32.lib”),再按照例程界面添加列表控件IDC_LIST1,及按钮控件<检查电脑安装协议>关联按钮控件的点击函数
void CGkbc8Dlg::OnDetect()
{
CListCtrl* pListCtl = (CListCtrl*)GetDlgItem(IDC_LIST1);
LPBYTE pBuf; //保存网络协议信息的缓冲区
DWORD dwLen; //缓冲区的长度
LPWSAPROTOCOL_INFO pInfo;
//通过调用WSAEnumProtocols以获得所需缓冲区的大小
int nRet = WSAEnumProtocols(NULL,NULL,&dwLen);
if(nRet == SOCKET_ERROR)
{
if(WSAGetLastError() != WSAENOBUFS)
{
MessageBox("调用失败");
return;
}
}
//检查缓冲区的大小是否可以容纳信息
if(dwLen < sizeof(WSAPROTOCOL_INFO))
{
MessageBox("缓冲区出现错误");
return;
}
dwLen++;
pBuf = (LPBYTE)malloc(dwLen); //申请所需的内存
if(pBuf == NULL)
{
MessageBox("内存分配失败");
return;
}
//进行枚举,nRet是返回的协议个数
nRet = WSAEnumProtocols(NULL,(LPWSAPROTOCOL_INFO)pBuf,&dwLen);
if(nRet == SOCKET_ERROR)
{
free(pBuf);
MessageBox("枚举失败");
return;
}
//遍历各协议的信息
pInfo = (LPWSAPROTOCOL_INFO)pBuf;
for(int nCount=0;nCount<nRet;nCount++)
{
//将协议信息添加到列表中
int i = pListCtl->GetCountPerPage();
pListCtl->InsertItem(i,pInfo->szProtocol);
pInfo++;
}
//释放内存
free(pBuf);
}
3.在OnInitDialog()中初始化套接字库及列表控件
WSADATA wsa; WSAStartup(MAKEWORD(2,2),&wsa);
CListCtrl* pListCtl = (CListCtrl*)GetDlgItem(IDC_LIST1);
pListCtl->SetExtendedStyle(LVS_EX_FLATSB
|LVS_EX_FULLROWSELECT
|LVS_EX_HEADERDRAGDROP
|LVS_EX_ONECLICKACTIVATE
|LVS_EX_GRIDLINES);
pListCtl->ModifyStyle(0,LVS_REPORT,0);
pListCtl->InsertColumn(0,"系统中安装的协议",LVCFMT_LEFT,550,0);
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/6216e77214fa8597be5ca5c6322bde35/0/0/w_19rstifqc5.swf-albumId=6347161209-tvId=6347161209-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件 [weixinlianxi]1[/weixinlianxi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4