CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Wyświetlenie zawartości upublicznionego zasobu sieciowego

Wyświetlenie zawartości upublicznionego zasobu sieciowego

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Wyświetlenie zawartości upublicznionego zasobu sieciowego

Nowy postprzez samurai-jerry » sobota, 19 lutego 2011, 19:45

Witam,

Piszę aktualnie prosty moduł zarządzający siecią, a ściślej synchronizacją danych w sieci.
Program ma działać w systemie operacyjnym Windows 2000.
Jako RAD IDE używam Borland C++ Builder v6.0.
Aplikacja ma na celu:
1. Wyliczenie zasobów sieciowych (to już zrobione dzięki jednemu z tutoriali Cyfrowego Barona),
2. Wyświetlenie zawartości danego zasobu sieciowego (mam tutaj na myśli wyświetlenie zawartości jakiegoś upublicznionego katalogu) - nad tym obecnie pracuję.
3. W oparciu o dane wyświetlone z udostępnionego publicznie katalogu będzie wykonana synchronizacja z danymi katalogu z dysku lokalnego (w szczególności w oparciu o wielkość i nazwę katalogów/plików).

Mam takie pytanie:

Czy jest możliwe wykonanie tego zadania bez użycia połączenia FTP przez Indy (IdFTP) a jedynie na takiej zasadzie jak odczytuje się zawartość katalogów z dysku lokalnego?

Zapewne coś robię źle, ale próbuję i próbuję i nic mi nie wychodzi.. :/

Oto mój kod:
Plik nagłówkowy:
Kod: Zaznacz cały
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <FileCtrl.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
        TPanel *Panel1;
        TButton *Button1;
        TComboBox *ComboBox1;
        TDirectoryListBox *DirectoryListBox1;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
private:// User declarations
        void __fastcall EnumNetRes(NETRESOURCE* nr);
public:   // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Plik źródłowy:
Kod: Zaznacz cały
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

void __fastcall TForm1::EnumNetRes(NETRESOURCE* nr)
{
HANDLE hEnum;

if(WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,
    RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_CONNECTABLE,
    nr,&hEnum) != NO_ERROR) return;

DWORD Count = -1;
DWORD BufferSize = 0;
DWORD ReturnVal = 0;

NETRESOURCE *NetRes=(NETRESOURCE *)new char[1024];
ZeroMemory(NetRes, sizeof(NETRESOURCE));
for(;;)
{
  ReturnVal = WNetEnumResource(hEnum, &Count, NetRes, &BufferSize);
  if(ReturnVal == ERROR_MORE_DATA)
  {
   Count = -1;
   delete [] NetRes;
   NetRes = (NETRESOURCE*)new char[BufferSize];
   ZeroMemory(NetRes, sizeof(NETRESOURCE));
   ReturnVal = WNetEnumResource(hEnum, &Count, NetRes, &BufferSize);
  }
  if(ReturnVal != NO_ERROR) break;

  for(unsigned int i = 0; i < Count; i++)
  {
   ComboBox1->Items->Add(NetRes[i].lpRemoteName);

   if((NetRes[i].dwUsage & RESOURCEUSAGE_CONTAINER) == RESOURCEUSAGE_CONTAINER)
       EnumNetRes(&NetRes[i]);
  }
  if(ReturnVal == ERROR_NO_MORE_ITEMS)
  {
   delete [] NetRes;
   WNetCloseEnum(hEnum);
  }
}
delete [] NetRes;
WNetCloseEnum(hEnum);
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
EnumNetRes(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
EnumNetRes(NULL);
if ((ComboBox1->Items->operator [](0))!="")
   {
   ComboBox1->Text=ComboBox1->Items->operator [](0);
   }

AnsiString Show_dir;          // zmienna pomocnicza
char Show_dir_char[MAX_PATH]; // zmienna pomocnicza
Show_dir=ComboBox1->Text;
Show_dir="\\\\"+Show_dir+"\\*.*"; // ścieżka podobnie jak w total commanderze
ShowMessage(Show_dir);        // info pomoc
ComboBox1->Text=Show_dir;


// konwersja AnsiString na char
strncpy(Show_dir_char , Show_dir.c_str(), sizeof Show_dir_char);
DirectoryListBox1->Clear();
DirectoryListBox1->Drive=(char)Show_dir_char;
}


Kod się kompiluje, ale w oknie DirectoryListBox (komponent Win3.1) wyświetla stale ten sam (źle wybrany katalog).
Podczas kompilacji linker wyrzuca także jakiś Warning, w postaci:
Kod: Zaznacz cały
[C++ Warning] Unit1.cpp(22): W8004 'ReturnVal' is assigned a value that is never used


Zapewne chodzi, o to, że z funkcji EnumNetRes zmienna ReturnVal nie została ani razu użyta, ale to jest akurat dla mnie szczegół.

Z góry WIELKIE DZIĘKI gdyby Ktokolwiek umiał mi jakoś pomóc z tym kodem tak, aby faktycznie dany zasób był wyświetlany w oknie DirectoryListBox1.

Pozdrawiam! samurai-jerry
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"No pain no gain" - Scorpions
Avatar użytkownika
samurai-jerry
Bladawiec
Bladawiec
 
Posty: 24
Dołączył(a): sobota, 19 lutego 2011, 19:04
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: W98,W2K,WXP
Kompilator: Borland C++ Builder v6.0 Personal
wxDevCpp v.6.9
ChromeIDE+Masm32
KDevelop
Gadu Gadu: 0
    WindowsFirefox

Re: Wyświetlenie zawartości upublicznionego zasobu sieciowego

Nowy postprzez Cyfrowy Baron » sobota, 19 lutego 2011, 20:45

Wyświetlenie zawartości danego zasobu sieciowego (mam tutaj na myśli wyświetlenie zawartości jakiegoś upublicznionego katalogu)


Czy chodzi o dane udostępnione nie poprzez protokół FTP, lecz o katalog udostępniony w sieci lokalnej?

Jeżeli tak to można np. posłużyć się komponentem TFileListBox w celu pokazania plików w tak udostępnionym katalogu:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 FileListBox1->Directory = "\\\\nazwa komputera\\\katalog udostępniony";
}


W takim przypadku wystarczy zwykłe wyszukiwanie plików i folderów jak na dysku lokalnym:

KOD cpp:     UKRYJ  
void __fastcall FindDir(TListBox *lista, String Dir)
{
  TSearchRec sr;

  if(FindFirst(Dir + "*.*", faAnyFile, sr) == 0)
     {
      do{
         if((sr.Name != ".") && (sr.Name != ".."))
          {
          if(((sr.Attr & faDirectory) > 0))
           FindDir(lista, Dir + sr.Name + "\\");

           lista->Items->Add(Dir + sr.Name);
          }
        }
        while(FindNext(sr) == 0);
        FindClose(sr);
     }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 FindDir(ListBox1, "\\\\nazwa komputera\\\katalog udostępniony");
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
samurai-jerry
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlenie zawartości upublicznionego zasobu sieciowego

Nowy postprzez samurai-jerry » sobota, 19 lutego 2011, 21:56

Czy chodzi o dane udostępnione nie poprzez protokół FTP, lecz o katalog udostępniony w sieci lokalnej?


Dokładnie tak.

Jeżeli tak to można np. posłużyć się komponentem TFileListBox w celu pokazania plików w tak udostępnionym katalogu:
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 FileListBox1->Directory = "\\\\nazwa komputera\\\katalog udostępniony";
}



Ja akurat potrzebuję DirectoryListBox (chodzi mi bardziej o katalogi, pliki później) , ale składnia jest prawie identyczna, tzn zastosowałem składnię:
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 DirectoryListBox1->Directory = "\\\\nazwa komputera\\\katalog udostępniony";
}


a dokładnie w moim konkretnym przypadku jest to podciągnięte do ComboBox1, w ten sposób:

KOD cpp:     UKRYJ  
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
int index_dir;
index_dir=Form1->ComboBox1->ItemIndex;
AnsiString show_path;
show_path=Form1->ComboBox1->Items->operator [](index_dir);
// ShowMessage(show_path); info pomoc
Form1->DirectoryListBox1->Directory=show_path;
}
 


Teraz tak.. Wszystko działa okey, pod warunkiem, że ComboBox1 nie zostanie ustawiony na zasób za który pokazuje tylko na nazwę grupy sieciowej, ogólną nazwę jak np. Microsoft Windows Network.
Po prostu jeśli za zasobem sieciowym ComboBox1 nie będzie widział nazwy katalogu udostępnionego to aplikacja zawiesi się, z kodem błędu: ElnOutError with message 'File not found'.
ComboBox1 musi dostać składnię w postaci:
"\\\\nazwa komputera\\\katalog udostępniony"
inaczej aplikacja zawiesi się.
Tylko jak wyselekcjonować taką składnię spośród tych wszystkich, które są w ComboBox1?

Muszę przy tym dodać, że dane do ComboBox1 są dostarczane poprzez funkcję EnumNetRes (która wylicza zasoby sieciowe).
Czy jest jakiś sposób żeby uchronić się przed tego typu błędem aplikacji?

Poniżej przesyłam zmieniony plik źródłowy (plik nagłówkowy nie uległ zmianie):

KOD cpp:     UKRYJ  
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

void __fastcall TForm1::FindDir(TListBox *lista, String Dir)
{
  TSearchRec sr;

  if(FindFirst(Dir + "*.*", faAnyFile, sr) == 0)
     {
      do{
         if((sr.Name != ".") && (sr.Name != ".."))
          {
          if(((sr.Attr & faDirectory) > 0))
           FindDir(lista, Dir + sr.Name + "\\");

           lista->Items->Add(Dir + sr.Name);
          }
        }
        while(FindNext(sr) == 0);
        FindClose(sr);
     }
}

void __fastcall TForm1::EnumNetRes(NETRESOURCE* nr)
{
 HANDLE hEnum;

 if(WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,
    RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_CONNECTABLE,
    nr,&hEnum) != NO_ERROR) return;

 DWORD Count = -1;
 DWORD BufferSize = 0;
 DWORD ReturnVal = 0;

 NETRESOURCE *NetRes=(NETRESOURCE *)new char[1024];
 ZeroMemory(NetRes, sizeof(NETRESOURCE));
 for(;;)
 {
  ReturnVal = WNetEnumResource(hEnum, &Count, NetRes, &BufferSize);
  if(ReturnVal == ERROR_MORE_DATA)
  {
   Count = -1;
   delete [] NetRes;
   NetRes = (NETRESOURCE*)new char[BufferSize];
   ZeroMemory(NetRes, sizeof(NETRESOURCE));
   ReturnVal = WNetEnumResource(hEnum, &Count, NetRes, &BufferSize);
  }
  if(ReturnVal != NO_ERROR) break;

  for(unsigned int i = 0; i < Count; i++)
  {
   ComboBox1->Items->Add(NetRes[i].lpRemoteName);

   if((NetRes[i].dwUsage & RESOURCEUSAGE_CONTAINER) == RESOURCEUSAGE_CONTAINER)
       EnumNetRes(&NetRes[i]);
  }
  if(ReturnVal == ERROR_NO_MORE_ITEMS)
  {
   delete [] NetRes;
   WNetCloseEnum(hEnum);
  }
 }
 delete [] NetRes;
 WNetCloseEnum(hEnum);
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
EnumNetRes(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
EnumNetRes(NULL);
if ((ComboBox1->Items->operator [](0))!="")
   {
   ComboBox1->Text=ComboBox1->Items->operator [](0);
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
int index_dir;
index_dir=Form1->ComboBox1->ItemIndex;
AnsiString show_path;
show_path=Form1->ComboBox1->Items->operator [](index_dir);
Form1->DirectoryListBox1->Directory=show_path;
}


Dzięki WIELKIE za dotychczasową pomoc Cyfrowy Baronie.

Postaram się znaleźć jakąś odpowiedź na moje pytanie na forum, ale jeśli to możliwe i Ktokolwiek wiedział, że jest jakaś prosta odpowiedź, albo może już podobny problem został rozwiązany to BARDZO PROSZĘ o pomoc.
Z góry WIELKIE DZIĘKI!!!

Pozdrawiam! samurai-jerry

Edit1:
Spróbuję zabezpieczyć aplikację przed występowaniem tego błędu stosując instrukcję try-catch...
Jak tylko coś wymyślę to zaraz tu wrzucę.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"No pain no gain" - Scorpions
Avatar użytkownika
samurai-jerry
Bladawiec
Bladawiec
 
Posty: 24
Dołączył(a): sobota, 19 lutego 2011, 19:04
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: W98,W2K,WXP
Kompilator: Borland C++ Builder v6.0 Personal
wxDevCpp v.6.9
ChromeIDE+Masm32
KDevelop
Gadu Gadu: 0
    WindowsFirefox

Re: Wyświetlenie zawartości upublicznionego zasobu sieciowego

Nowy postprzez polymorphism » sobota, 19 lutego 2011, 22:48

Teraz tak.. Wszystko działa okey, pod warunkiem, że ComboBox1 nie zostanie ustawiony na zasób za który pokazuje tylko na nazwę grupy sieciowej, ogólną nazwę jak np. Microsoft Windows Network.

Nie działa dlatego, bo jest to katalog/folder wirtualny, jest on częścią powłoki systemowej, ale nie systemu plików. Jeśli chcesz mieć obsługę tego typu folderów, powinieneś swoją uwagę skierować na interfejs IShellFolder.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
samurai-jerry
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlenie zawartości upublicznionego zasobu sieciowego

Nowy postprzez samurai-jerry » poniedziałek, 21 lutego 2011, 21:01

Chciałbym podać sposób w jaki -powiedzmy- częściowo rozwiązałem problem z przeglądaniem katalogu udostępnionego. Chciałbym przy tym zaznaczyć, że bardzo pomocne były dla mnie funkcje napisane przez Cyfrowego Barona, a w szczególności: FindDir(wyszukiwanie folderów, podfolderów i plików) i EnumNetRes (wyliczanie zasobów sieciowych), oraz jego podpowiedzi tutaj w poście.
Nie skorzystałem z rady polymorphism, choć nie wątpię że sposób podany przez niego rozwiązałby sprawę w zupełności. Niestety nie miałem zbyt wiele czasu oraz nie chciałem aż tak komplikować kodu.

Uwaga! Aplikacja będzie działać tylko w oparciu o katalogi udostępnione, nie będzie natomiast wyświetlała np. zawartości "Microsoft Windows Network", albo zawartości jakiejś grupy roboczej.

1. W mojej aplikacji (module sieciowym) ograniczyłem się żeby nie wypisywać wszystkich zasobów sieciowych a jedynie te, o które chodzi (czyli te z nazwami katalogów udostępnionych).
2. Założyłem, że użytkownik będzie z góry wiedział jak nazywa się zasób/katalog udostępniony i w tym celu dodałem do aplikacji komponent Edit, który nazwałem Ed_netdir.
3. Po uruchomieniu aplikacji komponent Ed_netdir jest pusty - trzeba wpisać z góry znaną nazwę katalogu udostępnionego w sieci.
4. Po wpisaniu nazwy katalogu udostępnionego do Ed_netdir zostaje uruchomiona funkcja PublicDir4Cmbx()
5. Zostaje wyczyszczona poprzednia zawartość ComboBox1.
6. Zostaje uruchomiona funkcja wyliczania zasobów sieciowych EnumNetRes, skąd wartości wędrują do ComboBox1.
7. Następnie funkcja strstr() sprawdza w pętli czy któryś z wyliczonych zasobów sieciowych zawiera katalog udostępniony, o który nam chodzi. Jeśli nie - a jest to częstsze- usuwa z ComboBox niewłaściwy wpis i kontynuuje wyszukiwanie, jeśli tak to przechodzi do kolejnego obrotu pętli.
8. W ComboBox1->Text zostaje wyświetlona pierwszy znaleziony udostępniony katalog sieciowy.
9. Komponenty takie jak: DirectoryListBox1 i pole edycyjne z aktualną ścieżką (Ed_actual_path) zostają zaktualizowane.

Pozdrawiam! samurai-jerry

P.S. cały kod w załączniku
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"No pain no gain" - Scorpions
Avatar użytkownika
samurai-jerry
Bladawiec
Bladawiec
 
Posty: 24
Dołączył(a): sobota, 19 lutego 2011, 19:04
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: W98,W2K,WXP
Kompilator: Borland C++ Builder v6.0 Personal
wxDevCpp v.6.9
ChromeIDE+Masm32
KDevelop
Gadu Gadu: 0
    WindowsFirefox

Re: Wyświetlenie zawartości upublicznionego zasobu sieciowego

Nowy postprzez Cyfrowy Baron » wtorek, 22 lutego 2011, 08:54

Rozwiązanie problemu z wyborem katalogu w ComboBox jest dość proste, wystarczy użyć funkcji DirectoryExists do sprawdzenia czy katalog wybrany w ComboBox istnieje, jeżeli nie istnieje, to znaczy że został wybrany inny zasób sieciowy nie będący katalogiem:
KOD cpp:     UKRYJ  
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
 int index_dir = ComboBox1->ItemIndex;

 String show_path = ComboBox1->Items->Strings[index_dir];

 if(!DirectoryExists(show_path)) return;

 DirectoryListBox1->Directory = show_path;
}
Trochę pozmieniałem Twój kod bo go przekombinowałeś. Po pierwsze jeżeli ComboBox1 znajduje się na Form1 to nie musisz go adresować poprzez Form1->ComboBox1, gdyż domyślnie to zawsze będzie Form1. Przeczytaj w serwisie Cyfrowy Baron w dziale: teoria poradę: Przekazywanie obiektów i funkcji pomiędzy formularzami. Po drugie przekombinowałeś z tym kodem:
KOD cpp:     UKRYJ  
show_path=Form1->ComboBox1->Items->operator [](index_dir);


Element listy można pobrać podając po prostu jego numer, tak jak masz to w powyższym przykładzie. Dlatego ten kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 EnumNetRes(NULL);

 if((ComboBox1->Items->operator [](0))!="")
 {
  ComboBox1->Text=ComboBox1->Items->operator [](0);
 }
}
Można uprościć:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 EnumNetRes(NULL);

 if(ComboBox1->Items->Count > 0)
 {
  ComboBox1->Text = ComboBox1->Items->Strings[0];
 }
}
Poza tym skoro wybierasz w ComboBox1 już na starcie jakiś zasób to dobrze by było, żeby w DirecotryListBox pojawił się tenże zasób o ile jest on katalogiem udostępnionym, więc ten kod można by zmodyfikować w ten sposób:
KOD cpp:     UKRYJ  
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 EnumNetRes(NULL);

 if(ComboBox1->Items->Count > 0)
 {
  ComboBox1->ItemIndex = 0;
  ComboBox1Change(Sender);
 }
}
Jeżeli nie rozumiesz co tutaj robi kod: ComboBox1Change(Sender) to zajrzyj do serwisu Cyfrowy Baron, dział: teoria, porada: Rzutowanie typów, przypisanie polimorficzne. Tam zostały pokazane jednak inne przykłady polimorfizmu, ale na jedno wychodzi. Mówiąc to prościej, ten kod wywołuje zdarzenie OnChange obiektu ComboBox1, a co za tym idzie wywołuje również kod znajdujący się w tym zdarzeniu. Zauważ, że wcześniej wybierany jest numer indeksu w ComboBox1 poprzez ItemIndex na 0, to tak samo jakbyś go wybrał myszką. Określenie indeksu poprzez kod nie powoduje jednak wywołania zdarzenia OnChange, dlatego potrzebny jest kod wywołujący to zdarzenie.

Kolejna sprawa. Skoro ComboBox1 służy tylko do wybierania katalogów udostępnionych to może dobrze byłoby tak zmodyfikować funkcję EnumNetRes, żeby wpisywała do ComboBox1 tylko katalogi udostępnione:

KOD cpp:     UKRYJ  
void __fastcall TForm1::EnumNetRes(NETRESOURCE* nr)
{
 HANDLE hEnum;

 if(WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,
    RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_CONNECTABLE,
    nr,&hEnum) != NO_ERROR) return;

 DWORD Count = -1;
 DWORD BufferSize = 0;
 DWORD ReturnVal = 0;

 NETRESOURCE *NetRes=(NETRESOURCE *)new char[1024];
 ZeroMemory(NetRes, sizeof(NETRESOURCE));
 for(;;)
 {
  ReturnVal = WNetEnumResource(hEnum, &Count, NetRes, &BufferSize);
  if(ReturnVal == ERROR_MORE_DATA)
  {
   Count = -1;
   delete [] NetRes;
   NetRes = (NETRESOURCE*)new char[BufferSize];
   ZeroMemory(NetRes, sizeof(NETRESOURCE));
   ReturnVal = WNetEnumResource(hEnum, &Count, NetRes, &BufferSize);
  }
  if(ReturnVal != NO_ERROR) break;

  for(unsigned int i = 0; i < Count; i++)
  {
   /* modyfikacja */
   String rName = NetRes[i].lpRemoteName;
   if(DirectoryExists(rName))
   {
    ComboBox1->Items->Add(rName);
   }

   if((NetRes[i].dwUsage & RESOURCEUSAGE_CONTAINER) == RESOURCEUSAGE_CONTAINER)
       EnumNetRes(&NetRes[i]);
  }
  if(ReturnVal == ERROR_NO_MORE_ITEMS)
  {
   delete [] NetRes;
   WNetCloseEnum(hEnum);
  }
 }
 delete [] NetRes;
 WNetCloseEnum(hEnum);
}


Jeżeli ComboBox1 służy tylko do wybierania elementów z listy bez możliwości wpisywania czegokolwiek do pola ComboBox to dobrze byłoby ustawić mu właściwość Style na csDropDownList

Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
samurai-jerry
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wyświetlenie zawartości upublicznionego zasobu sieciowego

Nowy postprzez samurai-jerry » wtorek, 22 lutego 2011, 13:18

for(;;)-krotne WIELKIE PODZIĘKOWANIA dla Ciebie Cyfrowy Baronie!!!
Pozdrawiam serdecznie! samurai-jerry
"No pain no gain" - Scorpions
Avatar użytkownika
samurai-jerry
Bladawiec
Bladawiec
 
Posty: 24
Dołączył(a): sobota, 19 lutego 2011, 19:04
Podziękował : 15
Otrzymał podziękowań: 0
System operacyjny: W98,W2K,WXP
Kompilator: Borland C++ Builder v6.0 Personal
wxDevCpp v.6.9
ChromeIDE+Masm32
KDevelop
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron