2

WNetGetUniversalName を呼び出す一部のコードに奇妙な問題があります。関数を呼び出すと、常にエラー 67 (ERROR_BAD_NET_NAME) が発生します。しかし、ネットワーク接続は実際に存在します。
だから最初から。指定したネットワーク ドライブにあるテキスト ファイルを処理する Windows シェル拡張機能を作成しています。したがって、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

問題について推測するのは少し難しいです。1 つの可能性はfile、ファイル名として渡している が正しくフォーマットされていないことです。たとえば、ファイルがルート共有ディレクトリにある場合でも、次のようなものz:test.txtは機能しません -- it requires: 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 に答える