工控编程吧
标题:
327上位机VC MFC获取计算机名称及工作组
[打印本页]
作者:
qq263946146
时间:
2016-9-22 15:30
标题:
327上位机VC MFC获取计算机名称及工作组
(, 下载次数: 4)
上传
点击文件名下载附件
获取计算机名称及工作组
功能展示
在上位机网络编程时,时常会涉及局域网的操作,当前例程可以获得当前电脑名称,并将其设置为窗口标题,点击<获得局域网工作组>会将当前局域网全部工作组罗列到列表框中,效果如图;
要点提示
例程主要用到的函数有WNetOpenEnum(), WNetEnumResource(), WNetCloseEnum();
1.WNetOpenEnum()用于启动对网络资源进行枚举的过程
,函数原型为DWORD WNetOpenEnum( DWORD dwScope, DWORD dwType, DWORD dwUsage, LPNETRESOURCE lpNetResource, LPHANDLE lphEnum );
参数 类型及说明:dwScope Long,指定要枚举的资源范围。可设为下述常数之一:
RESOURCE_CONNECTED 枚举已连接的资源(忽略dwUsage)
RESOURCE_GLOBALNET 枚举所有资源
RESOURCE_REMEMBERED 只枚举永久性连接
dwType Long,下述常数之一
RESOURCE_ANY 枚举所有类型的网络资源
RESOURCE_DISK 枚举磁盘资源
RESOURCE_PRINT 枚举打印资源
dwUsage Long,可设为零,表示枚举所有资源;或设为下述常数的一个或两个:
RESOURCEUSAGE_CONNECTABLE 只枚举那些能够连接的资源
RESOURCEUSAGE_CONTAINER 只枚举包含了其他资源的资源
lpNetResource NETRESOURCE,这个结构指定了一个容器资源。该函数会枚举包含于这里指定的某个指定资源内的资源。如设为NULL(把声明变成ByVal As Long),那么函数会枚举顶级网络资源。倘若在dwScope参数里没有指定RESOURCE_GLOBALNET,那么必须为NULL
lphEnum Long,指定一个变量,用于装载一个枚举句柄。该句柄由WNetEnumResource函数使用。必须用WNetCloseEnum函数将其清除
2.WNetEnumResource()用于枚举网络资源。函数原型为DWORD WNetEnumResource( HANDLE hEnum, LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize);
参数 类型及说明
hEnum Long,从WNetOpenEnum函数返回的一个句柄
lpcCount Long,最初设为要枚举的最大资源数量;或设为-1,表示枚举尽可能多的资源。一旦返回,就会设为实际枚举的资源数量
lpBuffer Any,通常是一个字节缓冲区的首字节。该缓冲区装载了枚举信息(可按引用声明为Byte)
lpBufferSize Long,以字节为单位指定lpBuffer数组的长度。如缓冲区不够大,则设为需要的缓冲区长度
3.WNetCloseEnum()用于结束一次枚举操作DWORD WNetCloseEnum( HANDLE hEnum ); 参数为?WNetOpenEnum函数返回的一个枚举句柄
实现功能
1.新建基于对话框的应用程序
2.在主对话框头文件添加#pragma comment(lib,“mpr.lib”),再添加一列表框控件IDC_LIST1,及按钮控件<获得局域网工作组>,并在OnInitDialog()中初始化
//<>列表框初始化
CListCtrl *pListCtrl = (CListCtrl *)GetDlgItem(IDC_LIST1);
pListCtrl->SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT
|LVS_EX_HEADERDRAGDROP |LVS_EX_ONECLICKACTIVATE |LVS_EX_GRIDLINES);
pListCtrl->ModifyStyle(0,LVS_REPORT);
pListCtrl->InsertColumn(0,"局域网内工作组",LVCFMT_LEFT,200,0);
//<>额外功能:设置窗口标题为 电脑名称
DWORD nSize = MAX_COMPUTERNAME_LENGTH;
char Buffer[MAX_COMPUTERNAME_LENGTH];
GetComputerName(Buffer,&nSize);
SetWindowText(Buffer);
3.关联按钮的点击响应函数,实现局域网工作组的获取及显示。
void CGkbc8Dlg::OnGet()
{
// DWORD nSize = MAX_COMPUTERNAME_LENGTH + 1;
// char Buffer[MAX_COMPUTERNAME_LENGTH + 1];
// GetComputerName(Buffer,&nSize);
// m_edit.SetWindowText(Buffer);
CListCtrl *pListCtrl = (CListCtrl *)GetDlgItem(IDC_LIST1);
HANDLE lphEnum;
DWORD Res;
Res = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER,NULL,&lphEnum);
DWORD Count=0xFFFFFFFF,Bufsize=409;
LPVOID Buf = new char[4096];
Res=WNetEnumResource(lphEnum,&Count,Buf,&Bufsize);
NETRESOURCE* nRes;
nRes=(NETRESOURCE*)Buf;
NETRESOURCE* nRes1;
LPVOID Bufwg = new char[4096];
for(DWORD n=0;n<Count;n++,nRes++)
{
DWORD NUM= 0xFFFFFFFF;
Res = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0,nRes,&lphEnum);
Res=WNetEnumResource(lphEnum,&NUM,Bufwg,&Bufsize);
int num= Bufsize/sizeof(NETRESOURCE);
nRes1=(NETRESOURCE*)Bufwg;
for(DWORD i=0;i<NUM;i++,nRes1++)
{
pListCtrl->InsertItem(i,0);
pListCtrl->SetItemText(i,0,nRes1->lpRemoteName);
}
}
delete Buf;
delete Bufwg;
WNetCloseEnum(lphEnum);
}
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/36a9b9c3897aac33d28645d5074fb9ae/0/0/w_19rstivu9l.swf-albumId=6347913109-tvId=6347913109-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件 [weixinlianxi]1[/weixinlianxi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4