C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[18448] Re:[질문] 공유폴더의 손모양 Overlay Icon 표시
유영인 [Chris] [cuperido] 1742 읽음    2002-05-14 09:27
Share 아이콘도 똑같은 방법으로 얻어오실 수 있습니다. 이미지 리스트의 0 번 아이템이 Share 아이콘 입니다.

Share 된 디렉토리를 알아내는 방법은, 두가지 방법이 있습니다. 하나는 커맨드 명령, 다른 한가지는 API를 이용하는 방법입니다.


1. 커맨드 명령
도스에서 "Net Share" 를 치면, 등록된, 네트워크를 보여줍니다. WinExec("Net Share > LIST.TXT", SW_HIDE); 이렇게 실행시키신 다음, LIST.TXT가 생기면 그 텍스트 파일을 분석하여 처리하시면 됩니다.


2. API를 이용

아래는 API를 이용하여 공유된 디렉토리를 뽑아오는 예제입니다,

Basically, you can use the WNetEnumResource() function in conjonction
with WNetOpenEnum() and WNetCloseEnum(). The following example is an
adaptation of code I found at the MSDN site:

  bool TForm1::EnumerateFunc(LPNETRESOURCE lpnr)
  {
     DWORD dwResult, dwResultEnum;
     HANDLE hEnum;
     DWORD cbBuffer = 16384; // 16K is a good size
     DWORD cEntries = -1; // enumerate all possible entries
     LPNETRESOURCE lpnrLocal; // pointer to enumerated structures
     DWORD I;

     dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, // all network
                                                 // resources
                             RESOURCETYPE_ANY, // all resources
                             0, // enumerate all resources
                             lpnr, // NULL first time the
                                       // function is called
                             &hEnum); // handle to the resource

     if (dwResult != NO_ERROR)
     {
        Memo1->Lines->Add(" > Error in WNetOpenEnum");
        return FALSE;
     }
     lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer);

     do
     {
        ZeroMemory(lpnrLocal, cbBuffer);
        dwResultEnum = WNetEnumResource(hEnum, // resource handle
                                        &cEntries, // defined as -1
                                        lpnrLocal, // LPNETRESOURCE
                                        &cbBuffer); // buffer size
        if (dwResultEnum == NO_ERROR)
        {
           for(I = 0; I < cEntries; I++)
           {
              Memo1->Lines->Add(Format("%s (Provider: %s)", ARRAYOFCONST
              ((lpnrLocal[I].lpRemoteName, lpnrLocal[I].lpProvider))));

              if(RESOURCEUSAGE_CONTAINER == (lpnrLocal[I].dwUsage
                                         & RESOURCEUSAGE_CONTAINER))
                 EnumerateFunc(&lpnrLocal[I]);
           }
        }
        else if (dwResultEnum != ERROR_NO_MORE_ITEMS)
        {
           Memo1->Lines->Add(" > Error in WNetEnumResource");
           break;
        }
     }
     while(dwResultEnum != ERROR_NO_MORE_ITEMS);

     GlobalFree((HGLOBAL)lpnrLocal);
     dwResult = WNetCloseEnum(hEnum);

     if(dwResult != NO_ERROR)
     {
        Memo1->Lines->Add(" > Error in WNetCloseEnum");
        return FALSE;
     }

     return TRUE;
  }

And then to call this function:

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
      EnumerateFunc(NULL);
  }

Note that this code lists resources on the entire network. To limit
your search to the local computer:

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
     NETRESOURCE nr;
     ZeroMemory(&nr, sizeof(nr));

     String RemoteName;
     ULONG Length = MAX_COMPUTERNAME_LENGTH;
     RemoteName.SetLength(Length + 1);
     GetComputerNameEx(ComputerNameNetBIOS, RemoteName.
        c_str(), &Length);
     RemoteName.SetLength(Length);
     RemoteName = "\\\\" + RemoteName;

     nr.lpRemoteName = RemoteName.c_str();
     nr.dwUsage = RESOURCEUSAGE_CONTAINER;
     nr.dwDisplayType = RESOURCEDISPLAYTYPE_SERVER;
     nr.dwType = RESOURCETYPE_DISK;
     nr.dwScope = RESOURCE_GLOBALNET;
     EnumerateFunc(&nr);
  }

Finally, you can modify the WNetOpenEnum() parameters to list only a
specific type of resources.

--
Yoto Yotov



이기주 님이 쓰신 글 :
: ListView나 TreeView에서
:
: 공유폴더의 손모양Icon을 Overlay Icon으로 표시하려고 합니다.
:
: 바로가기 아이콘은 SHGetFileInfo에서 SHGFI_LINKOVERLAY flag를 설정해주면 얻어올 수 있습니다.
:
: 하지만 손모양의 공유폴더 아이콘은 어떻게 얻어오는지 모르겠군요..
:
: 그리고 해당 폴더가 공유중인지 아닌지 알아내야 내는 방법도 알고 싶습니다.
:

+ -

관련 글 리스트
18420 [질문] 공유폴더의 손모양 Overlay Icon 표시 이기주 2060 2002/05/13
18448     Re:[질문] 공유폴더의 손모양 Overlay Icon 표시 유영인 [Chris] 1742 2002/05/14
18456         Re:Re:[질문] 공유폴더의 손모양 Overlay Icon 표시 이기주 1885 2002/05/14
18457             Re:Re:Re:[질문] 공유폴더의 손모양 Overlay Icon 표시 유영인 [Chris] 1418 2002/05/14
18458                 Re:Re:Re:Re:[질문] 공유폴더의 손모양 Overlay Icon 표시 이기주 1290 2002/05/14
18465                     Re:Re:Re:Re:Re:[질문] 공유폴더의 손모양 Overlay Icon 표시 유영인 [Chris] 1191 2002/05/14
18524                         Re:Re:Re:Re:Re:Re:[질문] 공유폴더의 손모양 Overlay Icon 표시 이기주 1772 2002/05/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.