NetShareEnumについて

解決


佐久間  2006-05-27 05:45:51  No: 61957

共有一覧を取得するために、マイクロソフトのサンプルの
NetShareEnumをXPの.Net 2003でコンパイルしようとしたのですが
"error C2664:LPTSTRからLPSTRに変換できない"となりした。
安易とはおもったのですが,LPSTRでキャストしてコンパイルはできたので
すが、日本語表示の共有フォルダが表示されません
デバックすると取得してはいるのですが、表示できず、空白なのです

初心者で申し訳ないのですが、みなさんのアドバイスいただけませんでしょうか?


Blue  2006-05-27 07:02:15  No: 61958

> LPSTRでキャストして
は危険なキャストです。
CStringから取得するならば、GetBufferやGetBufferLengthを使ったり
TCHAR型配列をを渡したりしてください。
けっして

CString s;
( LPSTR )( ( LPCTSTR )s )

みたいなキャストはしないでください。

> デバックすると
デバッグです。


Multi Posting  2006-05-27 07:04:33  No: 61959

http://www.belution.com/lounge/ja/viewtopics.php?id=20060525154330


佐久間  2006-05-27 08:12:01  No: 61960

具体的なソースはこうなのですが
この場合はどのようにすればいいのでしょうか?
--------------------------------------------
void wmain(int argc, TCHAR *lpszArgv[])
          略
LPTSTR   lpszServer = NULL;
          略
lpszServer = lpszArgv[2];
          略
NetShareEnum (lpszServer, 502, (LPBYTE *) &BufPtr, -1, &er, &tr, &resume);
---------------------------------------------
Multi postingの件はすみませんでした。


kure  2006-05-29 19:41:48  No: 61961

> void wmain(int argc, TCHAR *lpszArgv[])
↑は間違い。↓こうするべき。
int _tmain(int argc, _TCHAR* lpszArgv[])

NetShareEnumの第一引数はLMSTR型です。
これは_WIN32_WINNTやWINNTがdefineされている環境ではLPWSTR型になります。
また、LPTSTRはUNICODEがdefineされている環境でLPWSTR型になり、それ以外ではLPSTR型になります。

解決方法は

1.プロジェクトをUnicodeでビルドする
2.MultiByteToWideCharやmbstowcsを使って変換する

のどちらかになります。


佐久間  2006-05-30 07:43:34  No: 61962

Kureさん、ご回答ありがとうございます。
解決方法として1の方法は試しましたがダメでした。

迷惑を承知の上で、マイクロソフトのサンプルの載せます。
初めていろいろなことを勉強しているので
お見苦しいとは思いますが、アドバイスお願いします

#define UNICODE
#include <windows.h>
#include <stdio.h>
#include <lm.h>

void _tmain(int argc,TCHAR* lpszArgv[])
{
   PSHARE_INFO_502 BufPtr,p;

   NET_API_STATUS res;

   LPTSTR   lpszServer = NULL;

   DWORD er=0,tr=0,resume=0, i;

   switch(argc)
   {
  case 2:
      lpszServer = lpszArgv[1];
      break;

   default:

      printf("Usage: NetShareEnum <servername>\n");
     return;

   }
   printf("Share:              Local Path:                   Uses:               Descriptor:\n");

   printf("----------------------------------------------------------            -----------\n");

   do 
   {

      res = NetShareEnum (lpszServer, 502, (LPBYTE *) &BufPtr, -1, &er, &tr, &resume);

      
      if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA)

      {

         p=BufPtr;

      for(i=1;i<=er;i++)

         {

            printf("%-20S%-30S%-8u",p->shi502_netname, p->shi502_path, p->shi502_current_uses);

       if (IsValidSecurityDescriptor(p->shi502_security_descriptor))

               printf("Yes\n");

            else

               printf("No\n");

            p++;

         }

       NetApiBufferFree(BufPtr);

      }

      else

         printf("Error: %ld\n",res);

   }

   while (res==ERROR_MORE_DATA); 
   return;

}


佐久間  2006-05-30 08:08:03  No: 61963

自己スレです。
下記の定義を追加することで、正常にコンパイルはできたのですが、
やはり、日本語のフォルダ名は表示されません。

#define _WIN32_WINNT 0x0501

コマンドプロンプトで、サーバ名を渡して実行しているのですが
どうして、日本語のフォルダ名等が表示されないのでしょうか?


YuO  2006-05-30 10:59:11  No: 61964

setlocaleしていないからでは?


kure  2006-05-30 19:24:25  No: 61965

> 下記の定義を追加することで、正常にコンパイルはできたのですが

一度きちっとUnicode対応についてMSDNで調べることをお勧めします。
とりあえずできましたってだけだと潰しがききません。

で、本題。

サンプルソースのようにCRTのprintfを使ってるのであれば
YuOさんがご指摘している_tsetlocale(setlocaleのマクロ版)を使います。

std::coutやstd::wcoutを使っているのであればstd::localeを使います。

それぞれの使い方はMSDNを参照してください。

あとですね、

> 迷惑を承知の上で、マイクロソフトのサンプルの載せます。

とありますが、マイクロソフトのサンプルではなく、
佐久間さん自身のコードを提示されることをお勧めします。
実際のコードと異なるものを見て、頓珍漢な回答をされても文句は言えませんよ。


佐久間  2006-06-01 06:08:07  No: 61966

Blueさん,YuOさん,kureさん
本当にアドバイスありがとうございました。
解決いたしました。
今後はもっとプログラミングの勉強をしていきたいと思います
本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加