電子書籍の厳選無料作品が豊富!

WindowsにおいてFindFirstFileEx()関数を用いて、ディレクトリや
ファイルのリストを作成しています。

1.ローカルディスクについては全く問題ありません。

2.ネットワークパスについて:

a.ネットワークパス:

\\kako\public\*

も問題なくデータを取得できます。

b.ところが、ネットワークパス:

\\kako\*

の形式(コンピュータ名だけを指定。)は必ず失敗します。

複数のリモートマシンに対しても試してみましたが、コンピュー
タ名だけの指定では必ず関数は失敗してしまいます。どうやら"
共有フォルダ"の先頭ディレクトリのみ特別な処理が必要なのか
と思われます。

共有フォルダの一覧リストを作成するにはどうしたらよいので
しょうか?

A 回答 (3件)

>私はコンパイラをVC++ 6 を使っておりますが



どうなんですかねぇ……。
一応、その頃からこのAPIは使用可能だったハズですが……。

ただ、LPTSTRがどの型になるのか?は確認された方がいいでしょう。
「マルチバイト文字セット」にした時にはNetShareEnum()の第1引数がLPWSTRではない。と怒られましたけど。<VS2005にて
# 「UNICODE文字セット」である必要がある……ということになります。
# MSDNのページにあるサンプルでも「#define UNICODE」でUNICODE文字セットに設定しているので、LPTSTRはLPWSTRとなります。
LPWSTRで渡す必要があるようですのでMBCSの文字列をUNICODE文字列に変換する必要があるかも知れません。
# 実行環境がWin9Xとかならchar *なのでそのままでも問題ないハズですが……。

この回答への補足

リモートマシンの文字列"\\\\kako"を明確にUnicodeに変換したところ、うまく関数を実行できるようになりました。

補足日時:2013/02/06 16:09
    • good
    • 0
この回答へのお礼

Wr5様、たいへん長らくお付き合いいただいてありがとうございました。
私は今までコンパイル環境に Windows7 64bit VC++6 を使っていたのですが、同じコードを WindowsXP 32bit VC++6 環境に移したところ全く異なるエラーが発生するようになりました。
それは:

ERROR_NO_UNICODE_TRANSLATION 0x00000459

です。
このエラーはMultiByteToWideChar()などのコード変換関数が出しているようなので、ご指摘のようにこの問題の原因は『文字コード』にありそうです。

ところで、私はWindowsの文字コードが全く判りません。
LPCTSTR、LPTSTR、LPSTR、LPCSTR、などといわれても、意味も使い方も全く判りません。

そこで、これを機会に少し勉強させていただき、その上で結果をご報告させていただきます。

お礼日時:2013/02/05 13:11

>となってしまいます。


>何が悪いのでしょうか?

デバッグで追ってみると判るかと思われますが…
>LPTSTR lpszServer = (LPTSTR) "\\\\kako"; // Buffer;
が化けてます。
MBCSな文字列を無理矢理TSTRにキャストしますので、UNICODE版では狂ってしまいます。
LPTSTR lpszServer = _T("\\\\kako");
とするべきかと。

>while ( ret == ERROR_MORE_DATA );

セミコロンは間違い…ですよね?

PSHARE_INFO_502 Buf, pt;
NET_API_STATUS ret;
LPTSTR lpszServer = _T("\\\\kako"); // Buffer;
DWORD Num = 0 ,tr = 0,resume = 0, i;

do {
 ret = NetShareEnum(lpszServer, 502, (LPBYTE *)&Buf, -1, &Num, &tr, &resume);
 if (ret == ERROR_SUCCESS || ret == ERROR_MORE_DATA) {
  for(i = 0, pt = Buf; i < tr; i++, pt++) {
   OutputDebugString(pt->shi502_netname);
   OutputDebugString(_T("\n"));
  }
 }
 NetApiBufferFree(Buf);
} while(ret == ERROR_MORE_DATA);

ってところですかね。
    • good
    • 0
この回答へのお礼

添付いただいたコードをそっくりコピペして実行してみましたが現象に変わりはありません。

1.LPTSTR lpszServer = (LPTSTR) "\\\\kako";
私の環境ではもともとデバッガ上で文字化けすることはありませんでした。
今はご指摘のとおり"_T(...)"に変更しました。

2.セミコロンは間違い…ですよね?
はい。
私が例題をupする際に間違えたようです。ご指摘のとおり、";" は "{" です。

3.インフォメーションレベルを 0, 1, 2, 502, と試してみましたが変わりありません。

4.コンパイル時には lm.h 及び Netapi32.lib を使用しています。

私はコンパイラをVC++ 6 を使っておりますが、こんなものを使っているのが悪いのでしょうかね?

お礼日時:2013/02/05 10:10

>共有フォルダの一覧リストを作成するにはどうしたらよいので


>しょうか?

使ったことはありませんが…NetShareEnum()でしょうかね。
http://msdn.microsoft.com/ja-jp/library/cc446966 …

http://eternalwindows.jp/security/share/share03. …
とか。

この回答への補足

サンプルコードを探して、以下のコードを実行してみましたがうまくいきません。

PSHARE_INFO_502 Buf, pt;
NET_API_STATUS ret;
LPTSTR lpszServer = (LPTSTR) "\\\\kako"; // Buffer;
DWORD Num = 0 ,tr = 0,resume = 0, i;

ret = ERROR_MORE_DATA;
while ( ret == ERROR_MORE_DATA );
ret = NetShareEnum ( lpszServer, 502, (LPBYTE *) &Buf, -1, &Num, &tr, &resume );
if ( ret == ERROR_SUCCESS || ret == ERROR_MORE_DATA ) {
pt = Buf;
| | | |
}
}
NetApiBufferFree ( Buf );

lpszServerに試してみたのは:

\\kako
\\kako\
\\kako\public
\\kako\public\

などですが、いずれの場合もret値は:

53: ERROR_BAD_NETPATH(ネットワークパスが見つからない。)

となってしまいます。
何が悪いのでしょうか?

補足日時:2013/02/04 19:01
    • good
    • 0
この回答へのお礼

ありがとうございます。
試してみます。

お礼日時:2013/02/04 16:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報