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