//寫這個程序,為了是顯示局域網內的主機,然后通過用戶點擊選中的機器,檢查是否該主機上安裝有sqlserver,是為一個配置程序所寫的
//這里提供code,給有需要的朋友
//設置dll必須使用該命名空間
using system.runtime.interopservices;
#region 動態鏈接庫定義
[dllimport("mpr.dll",charset=charset.auto)] private static extern int wnetenumresource(intptr henum, ref int lpccount,intptr lpbuffer, ref int lpbuffersize );
[dllimport("mpr.dll",charset=charset.auto)] private static extern int wnetopenenum(resource_scope dwscope,resource_type dwtype,resource_usage dwusage,[marshalas(unmanagedtype.asany)][in] object lpnetresource,out intptr lphenum);
[dllimport("mpr.dll",charset=charset.auto)] private static extern int wnetcloseenum( intptr henum );
#endregion
#region 定義枚舉常量
public enum resource_scope
{
resource_connected = 0x00000001,
resource_globalnet = 0x00000002,
resource_remembered = 0x00000003,
resource_recent= 0x00000004,
resource_context= 0x00000005
}
public enum resource_type
{
resourcetype_any= 0x00000000,
resourcetype_disk= 0x00000001,
resourcetype_print = 0x00000002,
resourcetype_reserved = 0x00000008,
}
public enum resource_usage
{
resourceusage_connectable =0x00000001,
resourceusage_container=0x00000002,
resourceusage_nolocaldevice =0x00000004,
resourceusage_sibling=0x00000008,
resourceusage_attached=0x00000010,
resourceusage_all =(resourceusage_connectable | resourceusage_container | resourceusage_attached),
}
public enum resource_displaytype
{
resourcedisplaytype_generic= 0x00000000,
resourcedisplaytype_domain= 0x00000001,
resourcedisplaytype_server= 0x00000002,
resourcedisplaytype_share= 0x00000003,
resourcedisplaytype_file = 0x00000004,
resourcedisplaytype_group= 0x00000005,
resourcedisplaytype_network= 0x00000006,
resourcedisplaytype_root = 0x00000007,
resourcedisplaytype_shareadmin = 0x00000008,
resourcedisplaytype_directory = 0x00000009,
resourcedisplaytype_tree = 0x0000000a,
resourcedisplaytype_ndscontainer = 0x0000000b
}
public struct netresource
{
public resource_scope dwscope;
public resource_type dwtype;
public resource_displaytype dwdisplaytype;
public resource_usage dwusage;
[marshalas(system.runtime.interopservices.unmanagedtype.lptstr)] public string lplocalname;
[marshalas(system.runtime.interopservices.unmanagedtype.lptstr)] public string lpremotename;
[marshalas(system.runtime.interopservices.unmanagedtype.lptstr)] public string lpcomment;
[marshalas(system.runtime.interopservices.unmanagedtype.lptstr)] public string lpprovider;
}
public enum nerr
{
nerr_success = 0,/* success */
error_more_data = 234, // dderror
error_no_browser_servers_found = 6118,
error_invalid_level = 124,
error_access_denied = 5,
error_invalid_parameter = 87,
error_not_enough_memory = 8,
error_network_busy = 54,
error_bad_netpath = 53,
error_no_network = 1222,
error_invalid_handle_state = 1609,
error_extended_error= 1208
}
#endregion
#region 開始列舉網絡函數
public treenode pnode1;
public treenode pnode2;
public treenode pnode3;
private void wnetoe(object o)
{
int iret;
intptr ptrhandle = new intptr();
try
{
iret =wnetopenenum(resource_scope.resource_globalnet,resource_type.resourcetype_any,resource_usage.resourceusage_all,o,out ptrhandle );
if( iret != 0 )return;
int entries;
int buffer = 16384;
intptr ptrbuffer = marshal.allochglobal(buffer);
netresource nr;
for(;;)
{
entries = -1;
buffer = 16384;
iret =wnetenumresource(ptrhandle,ref entries,ptrbuffer,ref buffer);
if((iret != 0) || (entries<1))break;
int32 ptr = ptrbuffer.toint32();
for(int i=0;i<entries;i++ )
{
nr = (netresource)marshal.ptrtostructure( new intptr(ptr), typeof(netresource) );
if(resource_usage.resourceusage_container == (nr.dwusage & resource_usage.resourceusage_container))
{
ptr += marshal.sizeof( nr );
if(nr.dwdisplaytype == resource_displaytype.resourcedisplaytype_network)
{
pnode1 = tview.nodes.add(nr.lpremotename);//treeview
pnode1.imageindex = 0;
pnode1.selectedimageindex = 0;
}
else if(nr.dwdisplaytype == resource_displaytype.resourcedisplaytype_domain)
{
pnode2 = pnode1.nodes.add(nr.lpremotename);
pnode2.imageindex = 1;
pnode2.selectedimageindex =1;
}
else if(nr.dwdisplaytype == resource_displaytype.resourcedisplaytype_server)
{
string spcname = nr.lpremotename;
pnode3 = pnode2.nodes.add(spcname.substring(2,spcname.length-2));//此處為去處機器名稱前的兩個"http://"字符
pnode3.imageindex = 2;
pnode3.selectedimageindex = 2;
}
wnetoe(nr);
}
}
}
marshal.freehglobal( ptrbuffer );
iret =wnetcloseenum( ptrhandle );
}
catch(exception ex)
{
messagebox.show("查找本地網絡錯誤:"+ex.message,"錯誤",messageboxbuttons.ok,messageboxicon.error);
}
}
#endregion
//窗體load事件中,使用函數
private void frmdbconnconfig_load(object sender, system.eventargs e)
{
wnetoe(null);
}
新聞熱點
疑難解答