Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
26-02-2005 01:00
В общем нашел старый исходник.
Ищет все сетевые ресурсы.
function ConvertScope(var RE: TNetResource): TNetResourceScope;
begin
case RE.dwScope of
RESOURCE_CONNECTED: Result:=rsConnected;
RESOURCE_REMEMBERED: Result:=rsRemembered;
else Result:=rsGlobalNet;
end;
end;
function ConvertType(var RE: TNetResource): TNetResourceType;
begin
case RE.dwType of
RESOURCETYPE_DISK: Result:=rtDisk;
RESOURCETYPE_PRINT: Result:=rtPrint;
else Result:=rtAny;
end;
end;
function ConvertDisplayType(var RE: TNetResource): TNetResourceDisplayType;
begin
case RE.dwDisplayType of
RESOURCEDISPLAYTYPE_DOMAIN: Result:=rdDomain;
RESOURCEDISPLAYTYPE_SERVER: Result:=rdServer;
RESOURCEDISPLAYTYPE_SHARE: Result:=rdShare;
else Result:=rdGeneric;
end;
end;
function ConvertUsage(var RE: TNetResource): TNetResourceUsage;
begin
Result:=ruNone;
if RE.dwScope = RESOURCE_GLOBALNET then
case RE.dwUsage of
RESOURCEUSAGE_CONNECTABLE: Result:=ruConnectable;
RESOURCEUSAGE_CONTAINER: Result:=ruContainer;
end;
end;
var PNetResLocal: PNetResource;
iRes: TNetResource;
hEnum: THandle;
Result: DWORD;
i: integer;
Count, BufSize: Cardinal;
begin
Result:=WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, PNetRes, hEnum);
if Result <> 0 then
begin
if Assigned(FOnEnumError) then FOnEnumError(Self);
Exit;
end;
BufSize:=16384;
Count:=MAXDWORD;
PNetResLocal:=PNetResource(GlobalAlloc(GPTR, BufSize));
repeat
ZeroMemory(PNetResLocal, BufSize);
Result:=WNetEnumResource(hEnum, Count, PNetResLocal, BufSize);
if Result = 0 then
begin
for i:=0 to Count - 1 do
begin
iRes:=TNetResourceArray(PNetResLocal)[i];
FOnResFound(Self, ConvertScope(iRes), ConvertType(iRes),
ConvertDisplayType(iRes), ConvertUsage(iRes),
iRes.lpLocalName, iRes.lpRemoteName,
iRes.lpComment, iRes.lpProvider);
if RESOURCEUSAGE_CONTAINER = (iRes.dwUsage and RESOURCEUSAGE_CONTAINER) then
Enum(@TNetResourceArray(PNetResLocal)[i]);
end;
end else
if Result <> 259 then
if Assigned(FOnEnumError) then FOnEnumError(Self);
until Result = 259;
GlobalFree(Cardinal(PNetResLocal));
Result:=WNetCloseEnum(hEnum);
if Result <> 0 then
if Assigned(FOnEnumError) then FOnEnumError(Self);
end;
procedure TNetResourceEnumerator.Enumerate;
begin
if not Assigned(FOnResFound) then Exit;
if Assigned(FOnBeginEnum) then FOnBeginEnum(Self);
Enum(nil);
if Assigned(FOnEndEnum) then FOnEndEnum(Self);
end;
25-02-2005 14:39 | Комментарий к предыдущим ответам
Э-э-э-э-э
Вообщето это только принтера установленные на текущем компьютере.
Если нужно во всей сети обзор сделать, то там что-то другле нужно использовать. Но поискать там же в WinSDK можно.
procedure TForm1.FormShow(Sender: TObject);
Var Level : Byte;
Buffer, PrinterInfo : PChar;
i : Integer;
Flags, Count, NumInfos : DWORD;
PName,PPort:String;
begin
// Готовим список принтеров
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
Flags := PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL;
Level := 4;
end
else begin
Flags := PRINTER_ENUM_LOCAL;
Level := 5;
end;
Count := 0;
EnumPrinters( Flags, nil, Level, nil, 0, Count, NumInfos );
if Count = 0 then Exit;
GetMem( Buffer, Count );
TRY
if not EnumPrinters( Flags, nil, Level, PByte(Buffer), Count, Count, NumInfos ) then Exit;
PrinterInfo := Buffer;
for i := 0 to NumInfos - 1 do begin
if Level = 4 then begin
PName:=PPrinterInfo4(PrinterInfo)^.pPrinterName;
PPort:=PPrinterInfo4(PrinterInfo)^.pServerName;
Inc( PrinterInfo, SizeOf(TPrinterInfo4) );
end
else begin
PName:=PPrinterInfo5(PrinterInfo)^.pPrinterName;
PPort:=PPrinterInfo5(PrinterInfo)^.pPortName;
Inc( PrinterInfo, SizeOf(TPrinterInfo5) );
end;
//PName - название принтера в системе
//PPort - порт принтера
end;
FINALLY
FreeMem( Buffer, Count );
END;
end;
Если нужно больше информации посмотри EnumPrinters в WinSDK (в делфийском меню 'Help' есть такой пункт)
Посмотри в MSDN'e функции WNetOpenEnum/WNetEnumResources/WNetCloseEnum. С их помощью можно получить все общедоступные ресурсы сети, в т.ч. и расшаренные принтеры.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.