如何用程式指定路徑並連線網路磁碟機 |
答題得分者是:axsoft
|
Roach
中階會員 發表:61 回覆:104 積分:98 註冊:2002-11-05 發送簡訊給我 |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
Roach您好: 試試看這是否是您想要的東西 資料來源: src="http://www.bytesandmore.de/rad/cpp/main/img/connectdrives.png"> DWORD ConnectNetworkDrive(AnsiString slNetPath, char clDrive, bool blPermanent) { char cPath[3] = { char(0), ':', char(0) }; cPath[0] = toupper(clDrive); AnsiString slRemotePath = slNetPath; NETRESOURCE nr; ZeroMemory(&nr, sizeof(nr)); nr.dwScope= RESOURCE_GLOBALNET; nr.dwType = RESOURCETYPE_DISK; nr.dwDisplayType=RESOURCEDISPLAYTYPE_GENERIC; nr.dwUsage=RESOURCEUSAGE_CONNECTABLE; nr.lpLocalName=cPath; nr.lpRemoteName=slRemotePath.c_str(); nr.lpComment=NULL; nr.lpProvider=NULL; int ilResult = WNetAddConnection2(&nr, (LPSTR) NULL, (LPSTR) NULL, blPermanent ? CONNECT_UPDATE_PROFILE : 0); return ilResult; } DWORD DisconnectNetworkDrive(char clDrive, bool blPermanent) { char cPath[3] = { char(0), ':', char(0) }; cPath[0] = toupper(clDrive); return WNetCancelConnection2(cPath, blPermanent ? CONNECT_UPDATE_PROFILE : 0,TRUE); }範例下載:http://www.bytesandmore.de/rad/cpp/files/ConnectDrivesSrc.zip Demo Download: http://www.bytesandmore.de/rad/cpp/files/ConnectDrivesExe.zip /*生活是一種藝術,用心生活才能享受生活*/發表人 - axsoft 於 2003/09/26 10:26:54 |
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
網絡資源的列舉操作系統:Windows 98(95)/2000(NT) 編程語言:Borland C Builder 5.0 日期: 2001年9月27日 作者: 古老傳說 djie_hhz@sina.com 主頁: HTTP://www.wxiang.net 歡迎你對本文的轉載,轉載請註明作者和出處 針對於局域網的編程中常常需要我們得到局域網上一些相關信息,本文即是用編程實現共享資源的列舉 首先來看一下我們要用到的兩個相關API函數: ◆DWORD WNetOpenEnum( DWORD dwScope, // 指定列舉範圍 DWORD dwType, // 列舉資源的類型 DWORD dwUsage, // 指定列舉資源的使用情況 LPNETRESOURCE lpNetResource, // 指向NETRESOURCE結構的指針,指定要列舉的資源 LPHANDLE lphEnum //指向列舉句柄,用在後面的WnetEnumResource中 ); 參數dwScope可以是下列值之一或其組合: RESOURCE_CONNECTED 所有當前連接著的資源(將忽略dwUsage參數) RESOURCE_GLOBALNET 所有的網絡資源 RESOURCE_REMEMBERED 所有記住的(永久)連接(將忽略dwUsage參數) 參數dwType可以是下列值之一或其組合: RESOURCETYPE_ANY 所有資源(不能與RESOURCETYPE_DISK和RESOURCE_PRINT組合) RESOURCETYPE_DISK 僅所有磁盤資源 RESOURCETYPE_PRINT 僅所有打印資源 參數dwUsage可以是下列值之一或其組合: 0 所有資源 RESOURCEUSAGE_CONNECTABLE 所有可連接的資源 RESOURCEUSAGE_CONTAINER 所有包容器資源 參數lpNetResource指向NETRESOURCE結構,該結構指定了要列舉的包容器(container),如果此參數為NULL則表示列舉網絡的根(root) 函數調用正確的話, 返回值為NO_ERROR,否則返回下列錯誤代碼之一: ERROR_NOT_CONTAINER 表示lpNetResource參數沒有指向包容器 ERROR_INVALID_PARAMETER dwScope或dwType參數無效或參數組合錯誤 ERROR_NO_NETWORK 沒有網絡存在 ◆DWORD WNetEnumResource( HANDLE hEnum, // 列舉句柄 LPDWORD lpcCount, // 列舉資源最大個數 LPVOID lpBuffer, // 指向接收列舉結果的緩衝區,填充的實際是NETRESOURCE結構數組的形式 LPDWORD lpBufferSize // 指向一個DWORD變量,該變量指出了lpBuffer的大小 ); 這兩個函數中都用到了一個重要的結構NETRESOURCE,NETRESOURCE結構如下: typedef struct _NETRESOURCEA { DWORD dwScope;// 指定列舉範圍 DWORD dwType;// 列舉資源的類型 DWORD dwDisplayType;//網絡對像展示給用戶的類型 DWORD dwUsage;// 指定列舉資源的使用情況 LPSTR lpLocalName;//本地設備名 LPSTR lpRemoteName;//遠程設備名 LPSTR lpComment ; LPSTR lpProvider;//資源提供者的名字 }NETRESOURCE; 參數dwDisplayType可以是下列值之一: RESOURCEDISPLAYTYPE_DOMAIN 顯示為一個DOMAIN RESOURCEDISPLAYTYPE_GENERIC RESOURCEDISPLAYTYPE_SERVER 顯示為一個服務器 RESOURCEDISPLAYTYPE_SHARE 顯示為一個共享資源 關於WNetEnumResource的調用參數都很簡單,這裡就不再詳細指出了,下面我們用編程實現列舉所有網絡資源,並將其填充到一個TTreeView中 首先打開C Builder創建一個新程序 然後在Unit1.cpp的首部寫入下面的函數: bool __fastcall GetNetRes(TTreeNodes *Nodes,TTreeNode * Node, NETRESOURCE * pNetResource, int Depth) { //這是一個嵌套函數,其中Nodes為指定TListView實例的Items,Node為從指定節點擴展NULL為跟節點,pNetResource為列舉根, //Depth為列//舉深度,填入一個小於0的數,則深度為無窮,直到列舉完畢 #define ENUMBUFSIZE (16*1024) #define ENUMCOUNT 10 if (Nodes==NULL) return false; if (Depth==0) return true; HANDLE hEnum; bool reValue=true; NETRESOURCE *pNetRes,NetRes; if(WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,pNetResource,&hEnum)!=NO_ERROR) return false; char Buf[ENUMBUFSIZE]; DWORD ECount=ENUMCOUNT; DWORD ESize=ENUMBUFSIZE; DWORD EnumRst; do{ EnumRst=WNetEnumResource(hEnum,&ECount,Buf,&ESize); if (ESize>ENUMBUFSIZE) return false; if (EnumRst==NO_ERROR){ for (DWORD num=0;num pNetRes=((NETRESOURCE*)(Buf sizeof(NETRESOURCE)*num)); TTreeNode *tNode=Nodes->AddChild(Node,AnsiString(pNetRes->lpRemoteName)); if (pNetRes->dwDisplayType!=RESOURCEDISPLAYTYPE_SHARE) if(!GetNetRes(Nodes,tNode,pNetRes,Depth-1)) reValue=false; } } }while(ECount==ENUMCOUNT); if (EnumRst!=ERROR_NO_MORE_ITEMS&&EnumRst!=NO_ERROR) reValue=false; WNetCloseEnum(hEnum); return reValue; } 然後在TForm1的FormCreate事件中,寫入代碼,如下: void __fastcall TForm1::FormCreate(TObject *Sender) { Caption="列舉網絡資源實例"; TTreeView *TreeView1=new TTreeView(this);//創建一個TTreeView實例 TreeView1->Parent=this; TreeView1->Left=10; TreeView1->Top=10; TreeView1->Width=ClientWidth-20; TreeView1->Height=ClientHeight-20; if (!GetNetRes(TreeView1->Items,NULL,NULL,-1))//調用GetNetRes函數,從網絡的根列舉,並將數據添加到TreeView1的根節點 ShowMessage("列舉中出現了錯誤,可能是由一些資源的訪問需要用戶名和密碼引起的!"); if (TreeView1->Items->Item[0]!=NULL) TreeView1->Items->Item[0]->Expand(false); //展開 } /*生活是一種藝術,用心生活才能享受生活*/ |
Roach
中階會員 發表:61 回覆:104 積分:98 註冊:2002-11-05 發送簡訊給我 |
|
Egn
一般會員 發表:29 回覆:54 積分:16 註冊:2005-04-14 發送簡訊給我 |
|
Egn
一般會員 發表:29 回覆:54 積分:16 註冊:2005-04-14 發送簡訊給我 |
|
liang-shien
一般會員 發表:15 回覆:21 積分:7 註冊:2005-05-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |