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

Вниз

Проблемы с вызовом XcvDataW   Найти похожие ветки 

 
alexm_hs ©   (2007-02-04 23:26) [0]

Задача: Получить IP адрес (или имя) сетевого принтера.
Известно: имя хоста, на котором прописан порт принтера

Пытаюсь получить информацию об этом порте через вызов функции XcvData.  Код ошибки - 6 (неверный дескриптор)

как делаю:

.....
var
 XcvData: function(
   hPrinter: THandle;
   pszDataName : PWideChar;
   pInputData : Pointer;
   cbInputData : DWORD;
   pOutputData : Pointer;
   cbOutputData : DWORD;
   var pcbOutputNeeded, pdwStatus: DWORD): BOOL; stdcall;
.....
var hPrinter: thandle;
....
hPrinter := 0;
OpenPrinter("\\HOME", hPrinter, nil);
GetPrinterIP(hPrinter); //хенд ненулевой;

....
function GetPrinterIP(HPrn: THandle): string;
var
 FLibHandle: THandle;
 Buffer: PChar;
 Flags, Count, NumInfo: DWORD;
 s : WideString;
 e: DWORD;

begin
 FLibHandle := LoadLibrary("winspool.drv");
 if FLibHandle = 0 then Exit;
 @XcvData := GetProcAddress(FLibHandle, "XcvDataW");
 if not Assigned(XcvData) then
 begin
   FreeLibrary(FLibHandle);
   Exit;
 end;

 s := "L"IPAddress"";

 XcvData(HPrn, PWideChar(s), nil, 0, nil, 0, Count,NumInfo);
  e := GetLastError;

 if Count = 0 then Exit;
 GetMem(Buffer, Count);
 try
   if not XcvData(HPrn, PWideChar(s), nil, 0, PByte(Buffer), Count, Count,NumInfo) then
     Exit;
 finally
   FreeMem(Buffer, Count);
 end;
 FreeLibrary(FLibHandle);
end;

В чем может быть проблема?


 
alexm_hs ©   (2007-02-05 19:52) [1]

Сам спросил, сам отвечаю :)) РазобралсЯ таки

var
 XcvData: function(
   hPrinter: THandle;
   pszDataName: PWideChar;
   pInputData: Pointer;
   cbInputData: DWORD;
   pOutputData: Pointer;
   cbOutputData: DWORD;
   pcbOutputNeeded, pdwStatus: LPDWORD): BOOL; stdcall;

........................
.....................

function GetPrinterIP(HPrn: THandle): string;
var
 FLibHandle: THandle;
 Buffer: PChar;
 Count, NumInfo: DWORD;
 ip: string;
 i: integer;
 sizebuf: integer;
begin
 result := "";
 FLibHandle := LoadLibrary("winspool.drv");  //подгружаем драйвер спулера
 if FLibHandle = 0 then Exit;
 @XcvData := GetProcAddress(FLibHandle, "XcvDataW"); //функция не описана в WinSpool - грузим сами
 if not Assigned(XcvData) then
 begin
   FreeLibrary(FLibHandle);
   Exit;
 end;

 XcvData(HPrn, "IPAddress", nil, 0, nil, 0, @Count, @NumInfo); //вся фишка XcvData - во втором параметре. Описание
 //есть в MSDN, раздел TCPMON Xcv Commands. Один нюанс - если в МСДН описан параметр к примеру L"HostAddress", то
 //В Delphi он же должен выглядеть как "HostAddress". Все остальное там понятно.
 if Count = 0 then Exit;
 GetMem(Buffer, Count);
 sizebuf := Count;
 try
   if not XcvData(HPrn, "IPAddress", nil, 0, PByte(Buffer), Count, @Count, @NumInfo) then
     Exit;
   for i := 0 to sizebuf - 1 do
     if Buffer[i] <> #0 then
       ip := ip + Buffer[i];
   result := ip;
 finally
   FreeMem(Buffer, sizebuf);
 end;
 FreeLibrary(FLibHandle);
end;

///////////////////////////////////////////////////////////////////////////////////////////

function GetPrintersIP: TStrings;
var
 Buffer, PrinterInfo: PChar;
 Count, NumInfo: DWORD;
 I: Integer;
 Level: Byte;
 FPrinters: TStringList;
 hPrinter: THandle;
 pcname, prnname: string;
 prnip: string;
begin
 pcname := "\\server";   ///имя хоста, на котором пропиан порт сетевого принтера
 prnname := "\\server\LJ5K"; //имя сервера печати (имя принтера). Можно получить с помощью WinSpool.EnumPrinters.
 FPrinters := TStringList.Create;
 Result := FPrinters;
 try
   Level := 2;
   Count := 0;

   EnumPorts(PAnsiChar(pcname), level, nil, 0, Count, NumInfo);
   if Count = 0 then Exit;
   GetMem(Buffer, Count);
   try
     if not EnumPorts(PAnsiChar(pcname), Level, PByte(Buffer), Count, Count, NumInfo) then
       Exit;
     PrinterInfo := Buffer;
     for I := 0 to NumInfo - 1 do begin
       if pos("TCP/IP", PPortInfo2A(PrinterInfo)^.pDescription) <> 0 then begin //интересуют только порты TCP/IP
         OpenPrinter(PAnsiChar(prnname + ",XcvPort " + PPortInfo2A(PrinterInfo)^.pPortName), hPrinter, nil); //первый параметр
         //должен быть строкой типа "\\servername\printername,XcvPort PortName",
         //например: "\\MAINSERV\LJ5K,XcvPort IP_192.168.160.1"
         if hPrinter <> 0 then begin
           prnip := GetPrinterIP(hPrinter);
           FPrinters.Add(prnip);
         end;
         ClosePrinter(hPrinter);
       end;
       Inc(PrinterInfo, sizeof(TPortInfo2A));
     end;
   finally
     FreeMem(Buffer, Count);
   end;
 except
   FPrinters.Free;
   raise;
 end;
 Result := FPrinters;
end;
/////////////////////////////////////////////////////////
procedure TMainLSFrm.ToolButton2Click(Sender: TObject);
var sl: TStringList;
begin
 sl := TStringList.Create;
 sL.Assign(GetPrintersIP);
 //.....///
 SL.Free;
end;



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.043 c
2-1189420317
Nikola62
2007-09-10 14:31
2007.10.07
Как не дать форме открыться


15-1189400391
boriskb
2007-09-10 08:59
2007.10.07
85 правил русского языка


15-1189256604
Галинка
2007-09-08 17:03
2007.10.07
Переполнение буфера/кучи


2-1189324643
Dmitriy_
2007-09-09 11:57
2007.10.07
Как открыть сайт не во вкладке, а в новом окне IE?


2-1189577653
Washington
2007-09-12 10:14
2007.10.07
Местоположение формы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский