Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.04.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.022 c
15-1233170938
XeON
2009-01-28 22:28
2009.04.05
Какой язык использовать?


3-1217827688
Xmen
2008-08-04 09:28
2009.04.05
Соединение с FireBird


2-1234501149
Гарик
2009-02-13 07:59
2009.04.05
OnShow(self)


8-1192560705
MikeZ
2007-10-16 22:51
2009.04.05
Воспроизведение WAV-файла с определенной позиции


6-1201753581
MBo
2008-01-31 07:26
2009.04.05
Прием большого потока данных по UDP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский