Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  06:10[Войти] | [Зарегистрироваться]
Ответ на вопрос № 29184

25-02-2005 06:40
Хелп!
Как сделать так, чтобы прога автоматически нашла все принтеры в сети и вывела (показала) их в Memo или куда-нить ещё.
Заранее спасибо.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

26-02-2005 01:00
В общем нашел старый исходник.
Ищет все сетевые ресурсы.

unit EnumUnit;

interface

uses Windows, Classes;

type
    TNetResourceScope = (rsConnected, rsGlobalNet, rsRemembered);
    TNetResourceType = (rtAny, rtDisk, rtPrint);
    TNetResourceDisplayType = (rdDomain, rdServer, rdShare, rdGeneric);
    TNetResourceUsage = (ruNone, ruConnectable, ruContainer);

    TResourceFoundEvent = procedure(Sender: TObject;
                                    Scope: TNetResourceScope;
                                    ResType: TNetResourceType;
                                    DisplayType: TNetResourceDisplayType;
                                    ResUsage: TNetResourceUsage;
                                    LocalName, RemoteName, Comment,
                                    Provider: string) of object;

    TNetResourceEnumerator = class(TObject)
    private
        FOnBeginEnum: TNotifyEvent;
        FOnResFound: TResourceFoundEvent;
        FOnEndEnum: TNotifyEvent;
        FOnEnumError: TNotifyEvent;
        procedure Enum(PNetRes: PNetResource);
    public
        procedure Enumerate;
        property OnBeginEnum: TNotifyEvent read FOnBeginEnum write FOnBeginEnum;
        property OnEndEnum: TNotifyEvent read FOnEndEnum write FOnEndEnum;
        property OnResFound: TResourceFoundEvent read FOnResFound write FOnResFound;
        property OnEnumError: TNotifyEvent read FOnEnumError write FOnEnumError;
    end;

implementation

procedure TNetResourceEnumerator.Enum(PNetRes: PNetResource);

type TNetResourceArray = array of TNetResource;

    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;

end.





25-02-2005 14:39 | Комментарий к предыдущим ответам
Э-э-э-э-э
Вообщето это только принтера установленные на текущем компьютере.
Если нужно во всей сети обзор сделать, то там что-то другле нужно использовать. Но поискать там же в WinSDK можно.

25-02-2005 14:35
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' есть такой пункт)

25-02-2005 07:35
Посмотри в MSDN'e функции WNetOpenEnum/WNetEnumResources/WNetCloseEnum. С их помощью можно получить все общедоступные ресурсы сети, в т.ч. и расшаренные принтеры.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Однажды, в студеную зимнюю пору я из лесу вышел, был сильный ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

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

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования