【问题标题】:How can I resolve a ERROR_BAD_NET_NAME error in a call to WNetAddConnection2?如何解决对 WNetAddConnection2 的调用中的 ERROR_BAD_NET_NAME 错误?
【发布时间】:2012-03-15 00:44:45
【问题描述】:

我仍在尝试解决我遇到的问题,the first part of it 是我显然需要调用 WNetAddConnection2 才能使用 CreateFile 通过网络共享打开文件。

完成后,我现在收到来自 WNet...2 调用的 ERROR_BAD_NET_NAME 返回。

远程资源是 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 的原始回答者?如果是这样,是否有资源可以执行此操作,或者我应该自己解析字符串?

【问题讨论】:

  • 转换为 (char*) 只是阻止编译器告诉你做错了。移除石膏。如果编译器再次报错,实际转换字符串。或者始终使用 UNICODE。

标签: c++ winapi networking file-io


【解决方案1】:

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

如果共享已经连接到Z:,那么您不需要调用WNetAddConnection2

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

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

【讨论】:

  • 添加 WNetAddConnection2 的动机(请参阅链接问题)是 CreateFile 返回“系统找不到指定的路径”错误 Z:路径/文件名。如果相同的文件是本地的,则没有问题。 Z: 路径/文件名已映射并可从资源管理器访问而没有错误。综上所述,如果我不需要 WNetAddConnection2,我该如何解决原来的问题?
  • 如果 Windows 确实知道共享的含义,我该如何检索该信息? (没有设置一个配置选项让用户告诉我他们的网络服务器和共享名称是什么,这是以后要打破的另一件事)
  • 我的代码在用户模式 ​​Windows 线程中运行,该线程由内核模式应用程序加载的 dll 启动。内核模式应用程序是用户加载的,而不是服务。
  • 啊!除非它们是在会话 0 中创建的,否则网络连接是每个会话的。我猜 Z: 被映射在一个交互式会话中,但这对你的代码(我猜)在会话 0 中运行是不可见的。试图发现 Z: 映射到什么有点小技巧:那里可能不止一个与 Z 的交互式会话:在每个会话中映射到不同的网络共享。如果您的软件有一个在交互式会话中运行并与您的会话 0 组件通信的组件,那么它应该进行映射。如果没有,您的架构大纲会有所帮助。
  • 感谢您的帮助...由于它变得过于复杂,我需要调用此子系统的组件将文件移动到本地驱动器(从代码的那一侧来看很简单)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2010-12-31
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多