|
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를 설정해주면 얻어올 수 있습니다.
:
: 하지만 손모양의 공유폴더 아이콘은 어떻게 얻어오는지 모르겠군요..
:
: 그리고 해당 폴더가 공유중인지 아닌지 알아내야 내는 방법도 알고 싶습니다.
:
|