C++ 如何解决调用WNetAddConnection2时出现的错误\u BAD\u NET\u NAME错误?

C++ 如何解决调用WNetAddConnection2时出现的错误\u BAD\u NET\u NAME错误?,c++,winapi,networking,file-io,C++,Winapi,Networking,File Io,我仍在试图解决一个问题,我显然需要调用WNetAddConnection2,以便使用CreateFile在网络共享中打开文件 这样做之后,我现在收到一个错误\u BAD\u NET\u从WNet…2调用返回的名称 远程资源是windows网络上的映射网络文件夹(我们所在的客户端是windows xp)。网络资源应该在启动时连接,当然,假设这样做可能不好。文件夹映射到本地Z:。我可以使用资源管理器从机器上的目标文件夹访问、读取、写入和删除文件 HANDLE initFile ( LPCTSTR i

我仍在试图解决一个问题,我显然需要调用WNetAddConnection2,以便使用CreateFile在网络共享中打开文件

这样做之后,我现在收到一个错误\u BAD\u NET\u从WNet…2调用返回的名称

远程资源是windows网络上的映射网络文件夹(我们所在的客户端是windows xp)。网络资源应该在启动时连接,当然,假设这样做可能不好。文件夹映射到本地
Z:
。我可以使用资源管理器从机器上的目标文件夹访问、读取、写入和删除文件

HANDLE initFile ( LPCTSTR iNCfileName ) {
    DWORD dw;
    HANDLE fHandle=NULL;

    NETRESOURCE nr = {0}; //new structure for network resource
    nr.dwType = RESOURCETYPE_ANY; //generic resource (any type allowed)
    nr.lpLocalName = NULL; //does not use a device
    // typical iNCfileName is std::string a="Z:\\Documents\\somefile.txt".c_str()
    nr.lpRemoteName = (char*)iNCfileName;
    //"\\\\DOMAIN\\PATH\\FOLDER"; 
    nr.lpProvider = NULL; //no provider

    // CONNECT_CURRENT_MEDIA ??
    DWORD ret = WNetAddConnection2 (&nr, NULL, NULL, CONNECT_TEMPORARY); 

    //...

    return fHandle;
}

我认为问题在于我不能使用
Z:\Documents\somefile.txt
,而应该使用\\DOMAIN\PATH\FOLDER符号。如果是这样的话,我如何通过编程获得这些信息,以便将其作为输入提供?我是否误解了原始答案,即我可以将文件名转换为
\\\\Z\\Documents\\somefile.txt
?如果是这样的话,是否有资源来执行此操作,或者我应该自己解析字符串?

关于为什么它不工作,您是对的。当您应该传递共享名(例如
\\myserver\sharename
)时,您正在传递本地文件名(例如
Z:\Documents\somefile.txt

如果共享已连接到
Z:
,则无需调用
wnetadconnection2

如果共享尚未连接到
Z:
,则无法自动将
Z:\Documents\somefile.txt
转换为远程名称,因为Windows不知道
Z:
代表什么


如果共享可能未连接,则您的程序需要提前知道应该连接到哪个共享
Z:
,并自行建立连接。您可以将共享连接到
Z:
并使用现有路径,也可以不使用驱动器号连接共享并自行调整路径;您只需将
Z:\
替换为
\\myserver\sharename\

您说得对,它为什么不工作。当您应该传递共享名(例如
\\myserver\sharename
)时,您正在传递本地文件名(例如
Z:\Documents\somefile.txt

如果共享已连接到
Z:
,则无需调用
wnetadconnection2

如果共享尚未连接到
Z:
,则无法自动将
Z:\Documents\somefile.txt
转换为远程名称,因为Windows不知道
Z:
代表什么


如果共享可能未连接,则您的程序需要提前知道应该连接到哪个共享
Z:
,并自行建立连接。您可以将共享连接到
Z:
并使用现有路径,也可以不使用驱动器号连接共享并自行调整路径;您只需将
Z:\
替换为
\\myserver\sharename\

转换为(char*)即可阻止编译器告诉您操作错误。取下铸件。如果编译器再次抱怨,请实际转换字符串。或者一致地使用UNICODE。强制转换为(char*)只会阻止编译器告诉您这是错误的。取下铸件。如果编译器再次抱怨,请实际转换字符串。或者一致使用UNICODE。添加WNetAddConnection2(请参见链接问题)的动机是CreateFile在Z:path/filename中返回“系统找不到指定的路径”错误。如果同一个文件是本地文件,则没有问题。Z:path/filename已映射并可从资源管理器访问,没有错误。这么说来,如果我不需要WNetAddConnection2,我该如何解决最初的问题?如果Windows知道共享意味着什么,我该如何检索该信息?(除了输入一个配置选项让用户告诉我他们的网络服务器和共享名是什么,这是稍后要解决的另一个问题)我的代码在用户模式windows线程中运行,该线程由内核模式应用程序加载的dll启动。内核模式的应用程序是用户加载的,而不是服务。啊!除非在会话0中创建网络连接,否则每个会话都有网络连接。我猜Z:映射到了一个交互式会话中,但这对正在会话0中运行的代码来说是不可见的。试图发现Z:映射到什么将有点麻烦:每个会话中可能有多个交互会话,Z:映射到不同的网络共享。如果您的软件有一个在交互会话中运行并与会话0组件通信的组件,则该组件应进行映射。如果不是的话,你的架构大纲会有所帮助。谢谢你的帮助。。。由于它变得过于复杂,我要求调用此子系统的组件将文件移动到本地驱动器上(从代码的这一方面来说,这并不重要)。添加WNetAddConnection2(请参见链接问题)的动机是CreateFile返回一个带有Z:path/文件名的“系统找不到指定的路径”错误。如果同一个文件是本地文件,则没有问题。Z:path/filename已映射并可从资源管理器访问,没有错误。这么说来,如果我不需要WNetAddConnection2,我该如何解决最初的问题?如果Windows知道共享意味着什么,我该如何检索该信息?(除了输入一个配置选项让用户告诉我他们的网络服务器和共享名是什么,这是稍后要解决的另一个问题)我的代码在用户模式windows线程中运行,该线程由内核模式应用程序加载的dll启动。内核模式的应用程序是用户加载的,而不是服务。啊!除非在会话0中创建网络连接,否则每个会话都有网络连接。我猜Z:是以整数形式映射的