2011-01-20 222 views
2

我試圖訪問網絡驅動器(\ servername或\ ipadress)。這個想法是,只能通過應用程序訪問驅動器,並且網絡驅動器上的登錄名只能由應用程序使用。 到目前爲止,我只發現了WNetUseConnection函數(http://msdn.microsoft.com/en-us/library/aa385482%28VS.85%29.aspx),它看起來像我想要的東西。不幸的是我無法得到它的工作。代碼看起來像:在C++中訪問UNC驅動器/遠程網絡驅動器

NETRESOURCE nr;; 
    nr.dwType = RESOURCETYPE_DISK; 
    wchar_t remoteName[] = L"\\\\myremotenetworkdrive"; 
    nr.lpRemoteName = remoteName; 
    wchar_t pswd[] = L"mypswd"; 
    wchar_t usrnm[] = L"usrname"; 

    int ret = WNetUseConnection(NULL, &nr, pswd, usrnm, 0, NULL, NULL, NULL); 
    std::cerr << "return code: " << ret << std::endl; 

返回代碼是在第一1200(ERROR_BAD_DEVICE)和之後另一函數調用變爲487(ERROR_INVALID_ADDRESS)。地址(如果iam正確的話在這裏放置4個反斜槓,但也嘗試了兩個或根本沒有)用戶名和pswd是正確的。

所以基本上我的問題是:我如何獲得obove代碼的工作?考慮到我的任務是這種正確的方法(如果不是,你會怎麼做)?

+1

`\\ myremotenetworkdrive`看起來更像是一個服務器名稱;你的意思是'\\ server \ share`嗎? – Nate 2011-01-20 15:14:58

+0

是的,服務器上只有文件,通常在瀏覽器中輸入「\\ bla \ folders \ files」在窗口中訪問。 – 2011-01-20 15:20:50

回答

2

我相信你需要清除NETRESOURCE結構(或直接初始化所有成員)。設置其他值之前,memset的可能幫助:

memset(&nr, 0, sizeof(nr)); 

此外,還需要指定共享名在評論中指出:

wchar_t remoteName[] = L"\\\\server\\share"; 

另外,如果你想將它關聯與特定的驅動器盤符,您可以設置此成員:

nr.lpLocalName = L"z:"; 

不清除結構或以某種方式對其進行初始化,元素如lpLocalName將有它的「隨機」堆棧數據nd導致未定義的行爲。