你要解决两个最关键的问题:1.要时刻检测网络状态,所以最好在后台运行,并且最小化为系统托盘图标,你可以用现成的TrayIcon.zip控件或者调用Shell_NotifyIcon的API函数来达到这个目的;2.在局域网上检测某台机器是否在网上,你可以定义一个String型的数组,包含局域网上的所有工作站机器名,然后循环调用API函数gethostbyname,该函数的返回值为指向HostEnt结构指针,如果非空就表示找到此工作站,函数声明:Struct hostent FAR * gethostbyname(const char FAR * name);参数就是你要找的机器名
解决方案 »
- append增加时能不能增加在第一行
- DELPHI 7.0 读取excel 文档的内容!
- 如何在ListView中显示Hint?
- dbgrid 里面求位数的问题?
- 重问:怎样判断电脑是否安装了打印机?
- 谁知道DELPHI里的延时处理函数?
- 按文件名遍历文件夹及子文件夹查找文件并打开
- 如何使消息框在1秒后自动关闭,而不用点击其上的确认按扭
- help me,help me
- 怎样制作多媒体音量动态显示屏,象winmp3那样,随音量的高低而动态显示!
- 急!! 为什么我在网上邻居找不到计算机. HELP !
- 各位同志,用sql的order by 可以对表中的字段排序,那排序后如何再在dbgrid里生成一个名次的字段?
#include <classes.hpp>
#include <winnetwk.h>
//获取网上邻居的列表,存储在串表中
bool EnumNetResource(TStrings *rcList,LPNETRESOURCE lpNR, DWORD dwScope,DWORD dwType)
{
HANDLE hEnum = 0;
DWORD dwResult = WNetOpenEnum(
dwScope, // scope of enumeration
dwType, // resource types to list
0, // enumerate all resources
lpNR, // pointer to resource structure (NULL at first time)
&hEnum // handle to resource
) ;
if( dwResult != NO_ERROR ) return false; bool bRet=true;
DWORD dwEntries = 0xFFFFFFFF ; // enumerate all possible entries
NETRESOURCE NR[1024];
DWORD dwBuffer=1024*sizeof(NETRESOURCE); while(1) {
dwResult = WNetEnumResource(
hEnum, // resource-handle
&dwEntries,
(LPVOID)NR,
&dwBuffer
) ;
if( dwResult == ERROR_NO_MORE_ITEMS ) break;
else if( dwResult != NO_ERROR ) { bRet=false; break;} for(DWORD i = 0 ; i < dwEntries ; i++ ) {
if(NR[i].dwDisplayType==RESOURCEDISPLAYTYPE_SERVER) {
char *p=NR[i].lpRemoteName;
while(*p=='\\') p++;
if(*p) rcList->Add(p);
} else if((NR[i].dwUsage&RESOURCEUSAGE_CONTAINER)==
RESOURCEUSAGE_CONTAINER) {
bRet=EnumNetResource(rcList,&NR[i],dwScope,dwType);
if(bRet==false) break;
}
}
if(bRet==false) break;
} WNetCloseEnum(hEnum) ;
return bRet;
}
//------获取某主机的IP地址,如果主机名为空,则返回本机的名和IP地址---------AnsiString gethostip(AnsiString &host)
{
WSADATA wsaData;
AnsiString IP; WSAStartup(MAKEWORD(2,0),&wsaData);
if(host.IsEmpty()) {
char hostname[128];
if(gethostname(hostname,128)!=0) return AnsiString("");
host=hostname;
}
try{
struct hostent *hp=gethostbyname(host.c_str());
IP=inet_ntoa(*(struct in_addr*)hp->h_addr_list[0]);
}
catch(...){
IP="";
}
WSACleanup();
return IP;
}//----------------------Example-------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListBox1->Clear();
Screen->Cursor=crHourGlass;
EnumNetResource(ListBox1->Items,NULL,RESOURCE_GLOBALNET,RESOURCETYPE_ANY);
Screen->Cursor=crDefault;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(ListBox1->ItemIndex==-1) return;
Screen->Cursor=crHourGlass;
AnsiString IP=gethostip(ListBox1->Items->Strings[ListBox1->ItemIndex]);
Screen->Cursor=crDefault;
Edit1->Text=IP;
if(IP=="") ShowMessage("无法与主机联系!");
}
bcb