2011-01-20 181 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导致未定义的行为。