2016-12-08 3 views
1

На моем компьютере (1) У меня есть принтер Brother DCP. Это сетевой принтер. Я запускаю Delphi 7 Enterprise на XP (sp3).Является ли мой принтер сетевым принтером?

Теперь я хочу, чтобы Delphi сообщила мне, что это сетевой принтер.

У меня есть этот код:

Procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Coinitialize(NIL); 
    DOLPT2(); 
    // ShowMessage('test6 '); 
    COUninitialize; 
end; 

Procedure Tform1.DOLPT2(); 
begin; 
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2','',''); 
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Printer Where Default = True','WQL',wbemFlagForwardOnly); 
    oEnum   := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; 
    if oEnum.Next(1, FWbemObject, iValue) = 0 then 
    begin 
     Listbox1.Items.Add(Format('Name %s',[String(FWbemObject.Name)]));// String 
     Listbox1.Items.Add(' '); 
     Listbox1.Items.Add(Format('PRINTER_ATTRIBUTE_NETWORK %s',[Integer(FWbemObject.PRINTER_ATTRIBUTE_NETWORK)]));// Integer 
     Listbox1.Items.Add(Format('PRINTER_ATTRIBUTE_LOCAL %s',[Integer(FWbemObject.PRINTER_ATTRIBUTE_LOCAL)]));// Integer 
     Listbox1.Items.Add(' '); 
     FWbemObject := Unassigned; 
    end 
    ELSE 
    BEGIN 
     Listbox1.Items.Add(Format('Name %s',['Ingen printer'])); // String 
     Listbox1.Items.Add(' '); 
    END; 
end; 

(* Код скопирован с RUI - Благодаря ему *)

я получаю сообщение об ошибке, говорящее «МЕТОД ОТДЕЛЬНЫЕ ATTRIBUTE НЕ ПОДДЕРЖКЕ АВТОМАТИЗАЦИИ ОБЪЕКТА» на обоих атрибуты.

ИМЯ-атрибут работает нормально.

Я тоже пробовал 'wnetenumresource', но это не работает должным образом - кажется.

Что можно сделать, чтобы найти принтер NETWORK?

+0

запрос для local = false, это даст вам все сетевые принтеры – whosrdaddy

+0

@whosrdaddy: Извините, но я не знаю, что вы имеете в виду. Можете ли вы привести мне пример? –

+0

Измените свой запрос WMI на 'SELECT * FROM Win32_Printer Где Local = False' – whosrdaddy

ответ

-1

Я не совсем уверен, что конкретно вы ищете, но это дает все возможные типы. Обратите внимание, что я удалил ограничение по умолчанию - это только когда-нибудь вернет один принтер.

Procedure Tform2.DOLPT2; 
var 
    iValue : Cardinal; 
const 
    wbemFlagForwardOnly = $00000020; 
begin; 
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2','',''); 
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Printer','WQL',wbemFlagForwardOnly); 
    oEnum   := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; 
    if oEnum.Next(1, FWbemObject, iValue) = 0 then 
    begin 
     Listbox1.Items.Add(Format('Name %s',[String(FWbemObject.Name)]));// String 
     Listbox1.Items.Add(' '); 
     if FWbemObject.Shared then Listbox1.Items.Add('Shared'); 
     if FWbemObject.Network then Listbox1.Items.Add('Networked'); 
     if FWbemObject.Local then Listbox1.Items.Add('Local'); 
     Listbox1.Items.Add(' '); 
     FWbemObject := Unassigned; 
    end 
    ELSE 
    BEGIN 
     Listbox1.Items.Add(Format('Name %s',['Ingen printer'])); // String 
     Listbox1.Items.Add(' '); 
    END; 
end; 

Если вы хотите знать, что другие поля доступны, Google Win32_Printer класс и перейти на сайт Microsoft.

+0

Скопировал фрагмент кода, немного изменил его (измените IF, чтобы IF THEN ELSE, чтобы проверить, было ли выполнено attibuted (помня PRINTER_ATTRIBUTE_NETWORK). Моя топография сети: 4 (почти) персональный компьютер (ThinkCentre Lenovo/IBM), связанный с 5 PORT Hub/Router и принтер подключены к концентратору/маршрутизатору. ВСЕ МАШИНЫ дают тот же ответ -, name = Brother ..., LOCAL = TRUE, все остальные атрибуты = FALSE ..... Почему атрибут NETWORK и SHARED сообщает FALSE. Я не знаю, но я думаю (ошибочный?), Потому что это WORKGROUP (помня ваш первый абзац ранее.) НЕТ SERVER. –

+0

@ KristianSander Спасибо за разъяснение. Это делает вашу проблему намного яснее. Я ожидал, что Networked будет TRUE, а Local - FALSE. Я также ожидал, что Shared будет FALSE (что это такое). Возможно, whosrdaddy прав, и база данных не работает должным образом для XP, но, скорее всего, это ваш принтер/драйвер. Я предполагаю, что вы должны использовать специальную процедуру установки для этого принтера, и я думаю, что драйвер принтера регистрируется как локальный принтер, даже если сам принтер удален. Но все это догадки. – Dsm

+0

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

-2

Возможно, этот фрагмент кода от StackOverflow может вам помочь. idx_Net_printer - это константа, определяющая, является ли принтер сетевым принтером. Вам нужно будет адаптировать код. Я его не тестировал.

procedure TMyForm.RefreshPrinterList; 
var 
    I: Integer; 
    NewItem: TComboExItem; 
    PPrinterEnumArray, PLocator: PPrinterInfo2; 
    ArraySize, BufferSize: cardinal; 
    strBuffer: string; 
const 
    idx_Default_Net_printer = 0; 
    idx_Net_printer = 1; 
    idx_Default_Local_printer = 2; 
    idx_Local_printer = 3; 

begin 
    DefaultPrinterName := getDefaultPrinterName; 
    cbPrinterList.ItemsEx.Clear; 
    // S.G. 4/4/2008: list all other printers 
    // S.G. 4/4/2008: Get the necessary buffer size 
    ArraySize := 0; 
    BufferSize := 0; 
    PPrinterEnumArray := nil; 
    EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 2, nil, 0, BufferSize, ArraySize); 
    PPrinterEnumArray := AllocMem(BufferSize); 
    try 
    if EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 2, PPrinterEnumArray, BufferSize, BufferSize, ArraySize) then 
    begin 
     PLocator := PPrinterEnumArray; 
     if ArraySize > 0 then 
     begin 
     for I := 0 to ArraySize - 1 do // Iterate 
     begin 
      NewItem := cbPrinterList.ItemsEx.Add; 
      strBuffer := StrPas(PLocator^.pPrinterName); 
      UniqueString(strBuffer); // make sure we have a unique string instance and not a pointer 
      NewItem.Caption := strBuffer; 

      if AnsiSameText(DefaultPrinterName, strBuffer) then 
      begin 
      // default printer 
      if (PRINTER_ATTRIBUTE_LOCAL AND PLocator^.Attributes) <> 0 then 
      begin 
       // Local, default printer 
       NewItem.ImageIndex := idx_Default_Local_printer; 
      end 
      else 
      begin 
       // Network default printer 
       NewItem.ImageIndex := idx_Default_Net_printer; 
      end; 
      cbPrinterList.ItemIndex := NewItem.Index; 
      end 
      else 
      begin 
      // default printer 
      if (PRINTER_ATTRIBUTE_LOCAL AND PLocator^.Attributes) <> 0 then 
      begin 
       // Local, default printer 
       NewItem.ImageIndex := idx_Local_printer; 
      end 
      else 
      begin 
       // Network default printer 
       NewItem.ImageIndex := idx_Net_printer; 
      end; 
      end; 
      Inc(PLocator); 
     end; // for 
     end; 
    end; 
    finally // wrap up 
    FreeMem(PPrinterEnumArray); 
    end; // try/finally 
end; 
+0

Спасибо за фрагмент кода. К сожалению, это не сработает должным образом. , –

Смежные вопросы