|
죄송합니다.
답변해주신 내용으로 NetShareGetInfo함수를 어떻게 사용해야할지 모르겠습니다.
간단한 예제는 없을까요?
NET_API_STATUS NetShareGetInfo(
LPTSTR servername, <=이부분은 "\\이름\폴더"이런 형식인건지..
LPTSTR netname,
DWORD level,
LPBYTE *bufptr
);
아무튼 별짓을 다해봐도.. dll오류를 발생합니다.
그리고 하나더..
정말 어떤 폴더가 공유된상태인지 알아오는것은 이방법밖에는 없는건지요.
이방법은 우선 공유해놓은 이름을 찾아온다음 그 이름을 바탕으로 패스를 가져오고
가져온 패스를 폴더리스트중에서 일치하는것을 찾아서 결국 어떤 폴더가 공유된 상태이다..
이렇게 하는거겠죠?
이렇게 하면 공유된 폴더를 찾는데 시간이 많이 걸리지 않을까요?
공유이름 찾아오는것도 좀 걸리는것 같던데요..
그냥 어떤 함수에 폴더이름이나 ITMEID를 주면 파일속성 알려주듯이
share상태를 알려주는 것은 없을까요?
유영인 [Chris] 님이 쓰신 글 :
: NetShareGetInfo 을 사용하시면 됩니다.
:
: 1. 얻어온 공유명을 ASCII로 바꾼다. (원래는 UniCode임)
: 2. 얻어온 공유명을 대문자로 바꾼다.
: 3. NetShareGetInfo 을 이용한다. 네번째 buf_ptr 인자에서 SHARE_INFO_2 로 정의한 객체 하나를 넘겨주면, 리턴된 후 .shi2_path 에 들어있는 것이 전체 경로입니다.
: 4. 받아온 Path를 ASCII로 바꾼다.
:
: 행운을.. ^^
:
:
:
: 이기주 님이 쓰신 글 :
: : 어떻게 알아오죠?
: : 이것저것 건드려봐도..\\컴퓨터이름\공유폴더이름으로만 알아오네요..
: : 어떤 설정값을 바꿔주어야 하는건지요..
: :
: :
: :
: : 유영인 [Chris] 님이 쓰신 글 :
: : : 네네~~ 알아 내실 수 있습니다.. 공유 이름까지도 알아올 수 있습니다.
: : :
: : : 이기주 님이 쓰신 글 :
: : : : 답변 감사합니다.
: : : :
: : : : 답변해주신 내용으로 폴더의 패스를 알아낼 수 있는건가요?
: : : :
: : : : 예를 들면 내가 C:\Temp폴더를 공유해놓았다면,
: : : :
: : : : 스트링에 "C:\Temp"라는 풀패스를 알아올 수 있느냐 하는 겁니다.
: : : :
: : : : 아니면 내 HDD 폴더 "C:\Temp" 가 현재 공유중인지 아닌지 알 수 있는 지요.
: : : :
: : : :
: : : :
: : : :
: : : : 유영인 [Chris] 님이 쓰신 글 :
: : : : : 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를 설정해주면 얻어올 수 있습니다.
: : : : : :
: : : : : : 하지만 손모양의 공유폴더 아이콘은 어떻게 얻어오는지 모르겠군요..
: : : : : :
: : : : : : 그리고 해당 폴더가 공유중인지 아닌지 알아내야 내는 방법도 알고 싶습니다.
: : : : : :
|