Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.05;
Скачать: CL | DM;

Вниз

Доступ к расшаренным ресурсам   Найти похожие ветки 

 
asddsa   (2009-02-05 15:02) [0]

Всем привет!
Подскажите пожалуйста, как узнать доступен ли расшаренный ресурс?
просто если делать DirectoryExists("\\192.168.0.1\00\") , то операция может подвиснуть секунд на 50 в худшем случае если такой расшаренной папки не существует, что по времени не приемлимо, существуют ли более быстрые способы проверки?


 
clickmaker ©   (2009-02-05 15:29) [1]

WNetGetResourceInformation


 
asddsa   (2009-02-05 17:09) [2]


> clickmaker ©   (05.02.09 15:29) [1]
> WNetGetResourceInformation

вообщем попытался воспользоваться, но не получается, подскажите, что не так:
объявление функции:
function WNetGetResourceInformation(lpNetResource: PNetResource;
   lpBuffer: PNetResource; var lpcbBuffer: DWORD; lplpSystem: PChar): DWord; external "mpr.dll" name "WNetGetNetworkInformationA";

функция:
function share_func(share: string): boolean;
var
 NetResource1,NetResource2: PNetResource;
 SizeBuf,ErrorFunc: DWORD;
 Str_system: PChar;
begin
 GetMem(NetResource1,sizeof(TNetResource));
 GetMem(NetResource2,sizeof(TNetResource));

 with NetResource1^ do begin
   dwScope := RESOURCE_GLOBALNET;
   dwType := RESOURCETYPE_ANY;
   dwDisplayType := RESOURCEDISPLAYTYPE_SHARE;
   dwUsage := RESOURCEUSAGE_CONTAINER;
   lpLocalName := nil;
   lpRemoteName := PChar(share);
   lpComment := nil;
   lpProvider := nil;
 end;

 SizeBuf:=sizeof(TNetResource);

 ErrorFunc:=WNetGetResourceInformation(NetResource1,NetResource2,SizeBuf,Str_syst em);
 if ErrorFunc=0 then Result:=true
 else result:=false;

 FreeMem(NetResource1);
 FreeMem(NetResource2);
end;


вызываю функцию так:
share_func("\\192.168.0.7\00\")
но как бы не вызывал всегда возвращает ERROR_INVALID_ADDRESS, что я делаю не так?


 
clickmaker ©   (2009-02-05 18:02) [3]

для NetResource2 нужен буфер, чтобы вмещал и все строки, т.е. > sizeof(TNetResource)
выдели 1024, должно хватить
если не хватит, получишь ошибку ERROR_MORE_DATA


 
clickmaker ©   (2009-02-05 18:18) [4]

наверно, можно и через NetShareGetInfo из Netapi32.dll, там проще


 
asddsa   (2009-02-06 15:20) [5]

clickmaker, спасибо!

если кому интересно, сделал так, вроде все работает:

объявляем тип:
type
  TSHARE_INFO_501 = packed record
    shi501_netname: LPWSTR;
    shi501_type: DWORD;
    shi501_remark: LPWSTR;
    shi501_flags: DWORD
  end;


объявляем функцию:
function NetShareGetInfo(servername: LPWSTR; netname: LPWSTR; level: DWORD; bufptr: Pointer): DWORD; stdcall; External "Netapi32.dll" name "NetShareGetInfo";

сама функция:
function share_info(server_n, net_n: string): boolean;
var
 pbBuffer: ^TSHARE_INFO_501;
 Res: Integer;
 s1,s2: PWideChar;
begin
 GetMem(pbBuffer, 1024);

 s1:=StringToOleStr(server_n);
 s2:=StringToOleStr(net_n);

 Res := NetShareGetInfo(s1,s2,501,pbBuffer);
 if Res = 0 then  result:=true
 else result:=false;

 FreeMem(pbBuffer);
end;


 
asddsa   (2009-02-11 17:14) [6]

тут возник вопрос по расшаренным ресурсам, использую функцию написанную постом выше...
задача такая, определить на компьютере путь до папки по имени расшаренного ресурса, делаю так:
function share_info(d_n, sh_n: string): boolean;
var
 pbBuffer: PSHARE_INFO_2;
 Res: Integer;
 s2: PWideChar;

 ss: string;
begin
 GetMem(pbBuffer, 10000);
 FillChar(share, 1024, #0);
 ss:="";
 s2:=StringToOleStr(sh_n);

 Res := NetShareGetInfo(nil,s2,2,pbBuffer);
 if pbBuffer^.shi2_path<>nil then
    if Res = 0 then ss:=OleStrToString(pbBuffer^.shi2_netname);
 result:=true;
 FreeMem(pbBuffer);
end;

структура объявлена так:
type
 _SHARE_INFO_2 = record
   shi2_netname: LPWSTR;
   shi2_type: DWORD;
   shi2_remark: LPWSTR;
   shi2_permissions: DWORD;
   shi2_max_uses: DWORD;
   shi2_current_uses: DWORD;
    shi2_path: LPWSTR;
    shi2_passwd: LPWSTR;
 end;
PSHARE_INFO_2= ^_SHARE_INFO_2;


но в пути до папки всегда возвращает nil, что я делаю не так, или как можно получить путь до папки зная только имя расшаренного ресурса?


 
Smile   (2009-02-11 17:58) [7]

Просто интересно для чего может понадобиться имя конкретной папки?
Мне кажется, что имя расшаренного ресурса (это не обязательно имя папки на удаленном компьютере) предоставляет все возможности.


 
asddsa   (2009-02-11 21:59) [8]


> Просто интересно для чего может понадобиться имя конкретной
> папки?
> Мне кажется, что имя расшаренного ресурса (это не обязательно
> имя папки на удаленном компьютере) предоставляет все возможности.
>

мне нужно не на удаленном компьютере, а на том на котором запускается программа... чтобы знать что происходит с данной папкой, что туда заливают... я конечно могу удалить шару и заново ее создать, но это очень грубый вариант, т.к. этих папок может много расплодиться на компе, хотелось бы знать какая папка уже расшарена и с ней уже работать...


 
asddsa   (2009-02-12 11:16) [9]

вообщем сделал по-другому, спасибо гуглу и королевству дельфи... :)

объявляем тип:
type
 _SHARE_INFO_2 = record
   shi2_netname: LPWSTR;
   shi2_type: DWORD;
   shi2_remark: LPWSTR;
   shi2_permissions: DWORD;
   shi2_max_uses: DWORD;
   shi2_current_uses: DWORD;
   shi2_path: LPWSTR;
   shi2_passwd: LPWSTR;
 end;
PSHARE_INFO_2= ^_SHARE_INFO_2;
_SHARE_INFO_2_ARRAY = array [0..512] of _SHARE_INFO_2;
PSHARE_INFO_2_ARRAY = ^_SHARE_INFO_2_ARRAY;


объявляем экспортируемую функцию:
function NetShareEnum(servername: LPWSTR;
                     level: DWORD;
                     buf: Pointer;
                     prefmaxlen: DWORD;
                     entriesread: LPDWORD;
                     totalentries: LPDWORD;
                     resume_handle: LPDWORD):LongWord; stdcall; external "netapi32.dll";


сама функция:
function share_info_folder(d_n, sh_n: string): string;
var
 shareinfo: PSHARE_INFO_2_ARRAY;
 comp_name: PWideChar;
 RES: LongWord;
 entriesread,totalentries:DWORD;
 i: integer;
begin
 result:="";
 shareinfo:=nil;
 comp_name:=StringToOleStr(d_n);

 res:=NetShareEnum(comp_name,2,@shareinfo,DWORD(-1),@entriesread,@totalentries,nil);
 if res=0 then begin
   for i:= 0 to entriesread - 1 do
     if (String((shareinfo^[i].shi2_netname))=sh_n) then begin
       result:=String(shareinfo^[i].shi2_path);
       break;
     end;
 end;
end;


Хоть и не очень красиво, зато работает... :)



Страницы: 1 вся ветка

Текущий архив: 2009.04.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
4-1207513836
Alex
2008-04-07 00:30
2009.04.05
Расстояние между иконками в Virtual ListView.


11-1199012224
=BuckLr=
2007-12-30 13:57
2009.04.05
С новым годом!


2-1234283818
CodeMaster
2009-02-10 19:36
2009.04.05
Убрать кнопку минимизации


2-1234282972
Dr. Genius
2009-02-10 19:22
2009.04.05
Загрузка ЦП в процентах


2-1234787510
abhtr
2009-02-16 15:31
2009.04.05
Смена кодировки Win -> DOS для string