Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WNetGetUniversalName存在问题_C++_Windows Vista_Unc - Fatal编程技术网

C++ WNetGetUniversalName存在问题

C++ WNetGetUniversalName存在问题,c++,windows-vista,unc,C++,Windows Vista,Unc,我对一些调用WNetGetUniversalName的代码有一个奇怪的问题。当我调用函数时,我总是得到错误67(错误\坏\网络\名称)。但是网络连接确实存在。 所以从零开始。我正在编写一个WindowsShell扩展,它可以处理位于指定网络驱动器上的文本文件。因此,当调用IShellExtInit::Initialize方法时,我存储拖动的文件,然后使用WNetGetUniversalName方法获取连接名。 因此,我可以确定网络驱动器确实存在(因为它来自DragQueryFile方法)。 下面

我对一些调用WNetGetUniversalName的代码有一个奇怪的问题。当我调用函数时,我总是得到错误67(错误\坏\网络\名称)。但是网络连接确实存在。
所以从零开始。我正在编写一个WindowsShell扩展,它可以处理位于指定网络驱动器上的文本文件。因此,当调用IShellExtInit::Initialize方法时,我存储拖动的文件,然后使用WNetGetUniversalName方法获取连接名。
因此,我可以确定网络驱动器确实存在(因为它来自DragQueryFile方法)。
下面是一些代码:

char buffer[4096];  
REMOTE_NAME_INFO *info = (REMOTE_NAME_INFO*)buffer;  
DWORD length = 4096;  
info->lpConnectionName = NULL;  
info->lpRemainingPath = NULL;  
info->lpUniversalName = NULL;  
DWORD error = WNetGetUniversalName(file, REMOTE_NAME_INFO_LEVEL, info, &length);  
文件是来自DragQueryFile方法的ATL::CString,错误始终为67。

奇怪的是,它几天前确实工作了,但现在不再工作了,而且我没有更改发布的任何代码。

很难猜测这个问题。一种可能是您传递的
文件
的文件名格式不正确。例如,即使文件位于根共享目录中,类似于
z:test.txt
的内容也无法工作——它需要:
z:\\test.txt

调用WNetGetUniversalName的常用方法包括以下序列:

  • 使用小缓冲区调用以获取所需大小
  • 分配适当大小的缓冲区
  • 使用适当大小的缓冲区再次调用
  • 然而,与许多Windows网络函数不同的是,此函数显然首先检查您是否发送了一个正大小的非空指针,然后检查缓冲区是否足够大,以满足其返回的要求,因此序列如下所示:

    REMOTE_NAME_INFO temp;
    REMOTE_NAME_INFO *info = &temp;  
    DWORD size = sizeof(temp);
    
    // call with buffer that's valid but too small.    
    WNetGetUniversalNameA("z:\\test.txt", REMOTE_NAME_INFO_LEVEL, info, &size);
    
    // allocate large enough buffer:
    info = static_cast<REMOTE_NAME_INFO *>(::operator new(size));
    
    // call again with large enough buffer:
    WNetGetUniversalNameA("z:\\test.txt", REMOTE_NAME_INFO_LEVEL, info, &size);
    
    // Show result:
    std::cout << info->lpUniversalName;
    
    REMOTE\u NAME\u INFO temp;
    远程\u名称\u信息*信息=&temp;
    DWORD尺寸=尺寸(温度);
    //使用有效但太小的缓冲区调用。
    WNetGetUniversalNameA(“z:\\test.txt”,远程名称、信息级别、信息和大小);
    //分配足够大的缓冲区:
    信息=静态_转换(::运算符新建(大小));
    //使用足够大的缓冲区再次调用:
    WNetGetUniversalNameA(“z:\\test.txt”,远程名称、信息级别、信息和大小);
    //显示结果:
    std::cout-lpUniversalName;
    
    这个问题有点难猜。一种可能是您传递的
    文件
    的文件名格式不正确。例如,即使文件位于根共享目录中,类似于
    z:test.txt
    的内容也无法工作——它需要:
    z:\\test.txt

    调用WNetGetUniversalName的常用方法包括以下序列:

  • 使用小缓冲区调用以获取所需大小
  • 分配适当大小的缓冲区
  • 使用适当大小的缓冲区再次调用
  • 然而,与许多Windows网络函数不同的是,此函数显然首先检查您是否发送了一个正大小的非空指针,然后检查缓冲区是否足够大,以满足其返回的要求,因此序列如下所示:

    REMOTE_NAME_INFO temp;
    REMOTE_NAME_INFO *info = &temp;  
    DWORD size = sizeof(temp);
    
    // call with buffer that's valid but too small.    
    WNetGetUniversalNameA("z:\\test.txt", REMOTE_NAME_INFO_LEVEL, info, &size);
    
    // allocate large enough buffer:
    info = static_cast<REMOTE_NAME_INFO *>(::operator new(size));
    
    // call again with large enough buffer:
    WNetGetUniversalNameA("z:\\test.txt", REMOTE_NAME_INFO_LEVEL, info, &size);
    
    // Show result:
    std::cout << info->lpUniversalName;
    
    REMOTE\u NAME\u INFO temp;
    远程\u名称\u信息*信息=&temp;
    DWORD尺寸=尺寸(温度);
    //使用有效但太小的缓冲区调用。
    WNetGetUniversalNameA(“z:\\test.txt”,远程名称、信息级别、信息和大小);
    //分配足够大的缓冲区:
    信息=静态_转换(::运算符新建(大小));
    //使用足够大的缓冲区再次调用:
    WNetGetUniversalNameA(“z:\\test.txt”,远程名称、信息级别、信息和大小);
    //显示结果:
    std::cout-lpUniversalName;
    
    您是否验证了
    文件的内容是您认为的内容?(通过调试/日志?)是的,我还尝试了硬编码:DWORD dwError=WNetGetUniversalName(_T(“Z:\\test.txt”)、REMOTE_NAME_INFO_LEVEL、INFO和dwLength);DWORD dwError=WNetGetUniversalName(_T(“Z”)、REMOTE_NAME_INFO_LEVEL、INFO和dwLength);仍然是相同的结果。您是否验证了
    文件的内容是您认为的内容?(通过调试/日志?)是的,我还尝试了硬编码:DWORD dwError=WNetGetUniversalName(_T(“Z:\\test.txt”)、REMOTE_NAME_INFO_LEVEL、INFO和dwLength);DWORD dwError=WNetGetUniversalName(_T(“Z”)、REMOTE_NAME_INFO_LEVEL、INFO和dwLength);还是一样的结果。很抱歉没用。但这越来越奇怪了。我尝试了WNetGetConnection,它确实有效,但WNetGetUniversalName仍然无效。尽管如此,我还是想知道为什么WNetGetUniversalName不再起作用,因为我更喜欢使用这种方法。很抱歉,这没有帮助。但这越来越奇怪了。我尝试了WNetGetConnection,它确实有效,但WNetGetUniversalName仍然无效。尽管如此,我还是想知道为什么WNetGetUniversalName不再有效,因为我更喜欢使用这种方法。