Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Вопрос на засыпку


Автор: ButtonOFF 16.11.2009, 22:51
Так я нахожу все установленные протоколы в системе... через WSCEnumProtocols.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  WSAData: TWSADATA;
  Buf: LPWSAPROTOCOL_INFOW;
  Len: cardinal;
  Error: Integer;
  s : string;
begin
WsaStartUp($202, WSAData);
buf := VirtualAlloc(nil, 10000, MEM_COMMIT, PAGE_READWRITE);
WSCEnumProtocols(nil, buf, len, error);
while buf.szProtocol <> '' do
begin
  s := s + buf.szProtocol+#13#10;
  buf := Pointer(Dword(buf) +$274);
end;
Showmessage(s);
end;


Что удивительно, работает все четко, но при не использовании формы (код ниже), вылазит ошибка 10055 = WSAENOBUFS = Buffer length was too small to receive all the relevant WSAPROTOCOL_INFO structures and associated information. Pass in a buffer at least as large as the value returned in lpdwBufferLength (mdsn). Буфер маленький, это понятно. Но я его делал в двое и трое больше чем нужно, и все равно выскакивает эта ошибка. Посмотрев под отладчиком, вижу что буфер (какой бы он ни был) заполняется инфой на столько на сколько это возможно и только потом сообщает системе об ошибке. В коде ниже запись не происходит вообще. Но зато! в коде ниже возвращаемый размер и код ошибки показывается нормально, в отличие от примера выше, на этом в общем то и кончается весь позитив кода ниже  smile  

Собственно вопрос: Почему пример ниже не хочет работать? smile 

Код

program EnumPROTO;

{$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils,
  WinSock2,
  JwaWS2spi in '..\..\JwaWS2spi.pas';
var
  WSAData: TWSADATA;
  Buf: LPWSAPROTOCOL_INFOW;
  Len: cardinal;
  Error: Integer;
begin
WsaStartUp($202, WSAData);
buf := VirtualAlloc(nil, $10000, MEM_COMMIT, PAGE_READWRITE);
  if WSCEnumProtocols(nil, buf, len, error) > 0 then
    while buf.szProtocol <> '' do begin
        WriteLn(buf.szProtocol);
        buf := Pointer(Dword(buf) +$274);
    end;
  else WriteLn('Error '+IntToStr(error));
ReadLn(error);
end.

Автор: kami 17.11.2009, 01:49
Из кода не видно, где 
Код

Len :=$10000

???????

Получается, что в Len содержится мусор, и WSCEnumProtocols не может правильно определить размер переданного ей буфера.

Автор: ButtonOFF 17.11.2009, 10:31
kami, точно спасибо большое!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)