Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос на засыпку 
V
    Опции темы
ButtonOFF
Дата 16.11.2009, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 16.11.2009

Репутация: нет
Всего: нет



Так я нахожу все установленные протоколы в системе... через 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.

PM MAIL   Вверх
kami
Дата 17.11.2009, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Из кода не видно, где 
Код

Len :=$10000

???????

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

Это сообщение отредактировал(а) kami - 17.11.2009, 01:50
PM MAIL WWW   Вверх
ButtonOFF
Дата 17.11.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


улетевший
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 16.11.2009

Репутация: нет
Всего: нет



kami, точно спасибо большое!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0412 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.