Delphi XE и Winsock - PullRequest
       33

Delphi XE и Winsock

2 голосов
/ 22 января 2012

Я обновляю свое приложение с Delphi 2007 до Delphi XE.У меня есть свой персональный компонент Socket.В новой среде (XE) он не работает должным образом.Тот же код работает в Delphi 2007.

Вот мой фрагмент кода:

uses WinSock;

procedure TForm1.GetProtocolClick(Sender: TObject);
var
  ProtoEnt: PProtoEnt;
  FProtocol: Integer;
begin
  FProtocol := IPPROTO_TCP;
  ProtoEnt := getprotobynumber(FProtocol);
  if Assigned(ProtoEnt)
    then ShowMessage(ProtoEnt.p_name);
end;

var
  WSAData: TWSAData;

procedure Startup;
begin
  if WSAStartup($0101, WSAData) <> 0
  then raise Exception.Create('WSAStartup');
end;

procedure Cleanup;
begin
  if WSACleanup <> 0
  then raise Exception.Create('WSACleanup');
end;

initialization
  Startup;
finalization
  Cleanup;
end.

ProtoEnt всегда не назначается (т.е. = ноль) !!!!!

ПОЧЕМУ?

Я схожу с ума, чтобы решить эту проблему ... Спасибо

Энцо

1 Ответ

4 голосов
/ 22 января 2012

Если вы немного измените свой код

procedure TForm1.GetProtocolClick(Sender: TObject);
var
  ProtoEnt: PProtoEnt;
  FProtocol: Integer;
begin
  FProtocol := IPPROTO_TCP;
  ProtoEnt := getprotobynumber(FProtocol);
  if Assigned(ProtoEnt)
    then ShowMessage(ProtoEnt.p_name)
    else ShowMessage(IntToStr(WSAGetLastError));
end;

, вы увидите код ошибки;после этого проверьте коды ошибок WinSock

Я попробовал следующий, он отлично работает на XE:

var
  WSAData: TWSAData;

procedure Startup;
begin
  if WSAStartup($0101, WSAData) <> 0
  then raise Exception.Create('WSAStartup');
end;

procedure Cleanup;
begin
  if WSACleanup <> 0
  then raise Exception.Create('WSACleanup');
end;

procedure TForm1.Button5Click(Sender: TObject);
var
  ProtoEnt: PProtoEnt;
  FProtocol: Integer;
begin
  StartUp;
  FProtocol := IPPROTO_TCP;
  ProtoEnt := getprotobynumber(FProtocol);
  if Assigned(ProtoEnt)
    then ShowMessage(ProtoEnt.p_name)
    else ShowMessage(IntToStr(WSAGetLastError));
  CleanUp;
end;
...