Форум: "Начинающим";
Текущий архив: 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.006 c