NowCan及各位对系统熟系的朋友请来帮忙。

jianlinlong 2003-05-12 06:28:42
以下代码是从NowCan的个人主页上copy下来并改的,功能是查找网络上的所有计算机。能在win98,win2000上执行,到winnt 4.0(sp6)就执行不了,头晕中。

代码:
--------------------------------------------------------------------
bool TfrmMain::Enumerate(LPNETRESOURCE lpNetRC_p)
{
//查找网上邻居的所有计算机
HANDLE hEnum = 0;
DWORD dwScope = RESOURCE_GLOBALNET ;
DWORD dwType = RESOURCETYPE_ANY ;

DWORD dwResult = WNetOpenEnum(
dwScope, // scope of enumeration
dwType, // resource types to list
0, // enumerate all resources
lpNetRC_p, // pointer to resource structure (NULL at first time)
&hEnum // handle to resource
);

if (dwResult != NO_ERROR)
return false;

DWORD dwBuffer = 16384 ; // 16K is reasonable size
DWORD dwEntries = 0xFFFFFFFF ; // enumerate all possible entries
LPNETRESOURCE lpnrLocal = 0;

bool bRet = true;

AnsiString sComputerName;
try
{
do
{
// first allocate buffer for NETRESOURCE structures ...
lpnrLocal = (LPNETRESOURCE) GlobalAlloc( GPTR, dwBuffer ) ;
dwResult = WNetEnumResource(
hEnum, // resource-handle
&dwEntries,
lpnrLocal,
&dwBuffer
);

if (dwResult == NO_ERROR)
{
for (DWORD i=0; i<dwEntries; i++)
{
if (RESOURCEUSAGE_CONTAINER ==
(lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER) &&
lpnrLocal[i].dwDisplayType != RESOURCEDISPLAYTYPE_SERVER)
{
if (!Enumerate(&lpnrLocal[i])) {
throw Exception("在网上查找计算机失败!");
}
}else{
sComputerName = lpnrLocal[i].lpRemoteName; //计算机名
sComputerName.Delete(1, 2);
// AddListviewItem(sComputerName, lpnrLocal[i].lpComment);
}
}
}
} while (dwResult != ERROR_NO_MORE_ITEMS);
}catch(...){
bRet = false;
}

if (lpnrLocal)
GlobalFree((HGLOBAL)lpnrLocal) ;

WNetCloseEnum(hEnum) ;
return bRet;
}
...全文
39 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2003-05-15
  • 打赏
  • 举报
回复
学习!
NowCan 2003-05-13
  • 打赏
  • 举报
回复
我来了,但是,帮不了忙。我这里没有NT4的机器。
执行不了有什么出错提示吗?
poweruser 2003-05-13
  • 打赏
  • 举报
回复
呵呵现在nt4的机器可不好找了

那只好慢慢来了,在所有可能导致错误的地方加断点,调试。如果嫌麻烦,也可以把出错信息输出到一个Memo里去。

慢慢调试,把取值的地方打印出来用debug monitor查看
NowCan 2003-05-13
  • 打赏
  • 举报
回复
那只好慢慢来了,在所有可能导致错误的地方加断点,调试。如果嫌麻烦,也可以把出错信息输出到一个Memo里去。
jianlinlong 2003-05-13
  • 打赏
  • 举报
回复
我在一个Button的OnClick事件中写入上面的代码, 在98和2000上能找出网络上的所有计算机。在NT上执行的时候就没有作用了(好像这个Button的OnClick事件为空一样,点击它没有作用)
chifengwatch 2003-05-12
  • 打赏
  • 举报
回复
up
jianlinlong 2003-05-12
  • 打赏
  • 举报
回复
NowCan:
这段代码是在你的个人主页上面的:

<< 网上邻居列表(BCB) >>
<< 列出局域网内所有主机和共享目录(BCB) >>
jianlinlong 2003-05-12
  • 打赏
  • 举报
回复
我的调用方式:
Enumerate(NULL);

jianlinlong 2003-05-12
  • 打赏
  • 举报
回复
bool TfrmMain::Enumerate(LPNETRESOURCE lpNetRC_p)
{
//查找网上邻居的所有计算机
HANDLE hEnum = 0;
DWORD dwScope = RESOURCE_GLOBALNET ;
DWORD dwType = RESOURCETYPE_ANY ;
DWORD dwResult = WNetOpenEnum(dwScope, // scope of ation
dwType, // resource types to list
0, // enumerate all resources
lpNetRC_p, // pointer to resource ture (NULL at first time)
&hEnum // handle to resource
);

if (dwResult != NO_ERROR)
return false;

DWORD dwBuffer = 16384 ; // 16K is reasonable size
DWORD dwEntries = 0xFFFFFFFF ; // enumerate all possible entries
LPNETRESOURCE lpnrLocal = 0;

bool bRet = true;

AnsiString sComputerName;
try
{
do
{
// first allocate buffer for NETRESOURCE structures ...
lpnrLocal = (LPNETRESOURCE) GlobalAlloc( GPTR, dwBuffer ) ;
dwResult = WNetEnumResource(hEnum, // resource-handle
&dwEntries,
lpnrLocal,
&dwBuffer
);
if (dwResult == NO_ERROR)
{
for (DWORD i=0; i<dwEntries; i++)
{
if (RESOURCEUSAGE_CONTAINER == (lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER) &&
lpnrLocal[i].dwDisplayType != RESOURCEDISPLAYTYPE_SERVER)
{
if (!Enumerate(&lpnrLocal[i])) {
throw Exception("在网上查找计算机失败!");
}
}else{
sComputerName = lpnrLocal[i].lpRemoteName; //计算机名
sComputerName.Delete(1, 2);
// AddListviewItem(sComputerName, lpnrLocal[i].lpComment);
}
}
}
} while (dwResult != ERROR_NO_MORE_ITEMS);
}catch(...){
bRet = false;
}
if (lpnrLocal)
GlobalFree((HGLOBAL)lpnrLocal) ;

WNetCloseEnum(hEnum) ;
return bRet;
}

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧