Win2K网络和拨号连接里有一个本地连接,鼠标右击时出现一个菜单,第一项是禁用,执行后再点右击禁用变启用。请问如何用Delphi实现如上功能?
谢!

解决方案 »

  1.   

    转贴一.问题提出:每当你通过windows95或windows98访问"网上邻居"时,系统自动的建立了两
    台机器之间的网络连接关系,但是在访问结束后,并不自动的断开网络连接,
    所以有时我们关闭windows系统时,会弹出一个对话框,询问是否关闭网络连
    接,在回答"yes"后,才真正开始关闭计算机.
    程序员编制系统关闭程序时,就需要考虑这种情况,虽然sdk提供了关机的api:
    exitwindowsex()和exitwindows(),但实际应用中我发现,在指定force关机时
    在特定情况下会出问题.所以,必须想办法首先断开网络连接.二.编程接口:windows95及windows98提供的这方面的网络编程接口在svrapi.dll中,利用它
    我们可以列举出当前网络连接状态,控制或删除网络连接.windows附件中的
    netwatch.exe工具就是这样实现的.
    也许您会问,netapi的详细说明在开发工具的sdk文档中很详细了,没有必要在
    此演示.但是,在查寻了很多资料后,我不得不说:msdn中有关netapi的部分说
    明是错误的,至少是不完整而且含混不清的,可以说,依靠这些文档,你不能实
    现全部的功能!下面的代码是本人自己分析得来,使用后,您会发现正确的应用
    和文档说明有多么大的差距.三.api声明:关闭网络连接的实现方法分两步: 枚举出当前所有的网络连接状况; 依次
    断开枚举出的网络连接.1.枚举出当前所有的网络连接状况:
            依照开发帮助文档,这个api是这样的:
            net_api_status netsessionenum(
              lpwstr servername,    
              lpwstr uncclientname,  
              lpwstr username,      
              dword level,          
              lpbyte *bufptr,        
              dword prefmaxlen,      
              lpdword entriesread,  
              lpdword totalentries,  
              lpdword resume_handle  
            );        但是,实际情况是,在windows95和windows98平台下,
            这样调用根本就无法连接上库文件.真正的api声明应该是:
            dword netsessionenum( lpstr,
                                  dword,
                                  lpbyte,
                                  dword,
                                  lpdword,
                                  lpdword )
            参数1: null表示枚举本机的网络连接
            参数2: 不详.在枚举中是常量0x32.
            参数3: 存放信息的缓冲区指针
            参数4: 缓冲区长度
            参数5: 指向返回连接个数
            参数6: 指向总共连接个数
            可见,参数个数完全不同,另外参数意义也发生了变化.2.依次断开枚举出的网络连接:
            还算幸运的是,断开网络连接的api声明是正确的:
            net_api_status netsessiondel(
                      lpwstr servername,    
                      lpwstr uncclientname,  
                      lpwstr username    );
            不过要注意的是,第2个和第3个参数的内容需要
            从枚举得到的缓冲区中去取.具体方法参见程序.四.源代码:以下是实现断开网络连接的子程序,你可以方便的把它们加入到自己的项目中
    去,而不用和我一样浪费时间去研究到底怎样实现网络枚举了.注:由于本程序只实际用到了一个svrapi.dll中的函数声明,简便期间,我没有
    用原有的头文件,自己定义一下就可以了.///////////////////////////////////////////////////////////////////
    // file:        netclose.h
    // version:    1.01#define netbuff_size    0x208#define netsessionenum_profile  ( dword (__stdcall *)        ( lpstr, dword, lpbyte, dword, lpdword, lpdword ) )
    #define netsessiondel_profile  ( dword (__stdcall *)                                ( lpstr, lpstr, dword ) )
    ///////////////////////////////////////////////////////////////////
    // file:        netclose.cpp
    // version:    1.01
    ///////////////////////////////////////////////////////////////////
    // define:              bool netcloseall( void )
    // parameters:          none
    // return:              true or false
    //
    // author:              mr.huang fei
    // time:                5/7/1998
    // note:                can only be used on windows95 & windows98
    // re:              close all network connections
    ///////////////////////////////////////////////////////////////////
    bool netcloseall( void )
    {
            byte    bybuff[netbuff_size];
            dword  dwnetret                = 0;;
            dword  i                      = 0;
            dword  dwentries              = 0;
            dword  dwtotalentries          = 0;
            lpstr  szclient                = null;
            dword  dwusername              = 0;
            bool    bret                    = false;
            lpbyte  lpbybuff = (lpbyte)bybuff;        dword (__stdcall * hooknetsessionenum)( lpstr, dword,                                lpbyte, dword, lpdword, lpdword );
            dword (__stdcall * hooknetsessiondel)( lpstr, lpstr, dword );        hinstance hmod = loadlibrary( "svrapi.dll" );
            if( hmod != null )
            {
                    // get the address of function
                    hooknetsessionenum = netsessionenum_profile
                                        getprocaddress
                                    ( hmod, text("netsessionenum") );
                    hooknetsessiondel  = netsessiondel_profile
                                        getprocaddress
                                    ( hmod, text("netsessiondel") );                if( ( hooknetsessiondel != null ) &&
                        ( hooknetsessionenum != null ) )
                    {
                            dwnetret = hooknetsessionenum(  null,
                                              0x32, bybuff,
                                              netbuff_size, &dwentries,
                                              &dwtotalentries );
                            if( dwnetret == 0 )
                            {
                                bret = true;
                                for( i=0; i < dwtotalentries; i++ )
                                {
                                  szclient = (lpstr)(((dword *)
                                                lpbybuff)[0]);
                                  dwusername = ((dword *)lpbybuff)[2];
                                  dwnetret = hooknetsessiondel( null,
                                                szclient, dwusername );
                                  if( dwnetret != 0 )
                                  {
                                          bret = false;
                                          break;
                                  }
                                  lpbybuff += 26;
                                }
                            } // netsessionenum(...)
                            else
                                    bret = false;
                    } // getprocaddress(...)
                    else
                            bret = false;                freelibrary( hmod );
            } // loadlibrary(...)
            return bret;