2

我对一些调用 WNetGetUniversalName 的代码有一个奇怪的问题。当我调用该函数时,我总是收到错误 67 (ERROR_BAD_NET_NAME)。但是网络连接确实存在。
所以从头开始。我正在编写一个 Windows shell 扩展,它将对位于指定网络驱动器上的文本文件做一些事情。因此,当调用 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);  

file 是来自 DragQueryFile 方法的 ATL::CString ,错误始终为 67。
奇怪的是它在几天前确实有效但现在不再有效,而且我没有更改发布的任何代码。

4

1 回答 1

0

很难猜测这个问题。一种可能性是file您传递的文件名格式不正确。例如,即使文件在根共享目录中,类似的东西z:test.txt也行不通——它需要:z:\\test.txt.

调用 WNetGetUniversalName 的常用方法涉及如下序列:

  1. 使用小缓冲区调用以获得所需的大小
  2. 分配适当大小的缓冲区
  3. 使用适当大小的缓冲区再次调用

然而,与很多 Windows 网络函数不同的是,这个函数显然首先检查您是否发送了一个具有正大小的非 NULL 指针,然后检查缓冲区是否足够大以容纳它想要返回的内容,因此序列看起来有点像像这样:

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;
于 2010-01-25T17:44:26.447 回答