Так я нахожу все установленные протоколы в системе... через 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). Буфер маленький, это понятно. Но я его делал в двое и трое больше чем нужно, и все равно выскакивает эта ошибка. Посмотрев под отладчиком, вижу что буфер (какой бы он ни был) заполняется инфой на столько на сколько это возможно и только потом сообщает системе об ошибке. В коде ниже запись не происходит вообще. Но зато! в коде ниже возвращаемый размер и код ошибки показывается нормально, в отличие от примера выше, на этом в общем то и кончается весь позитив кода ниже
Собственно вопрос: Почему пример ниже не хочет работать?
| Код | 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.
|
|