2012-01-22 2 views
2

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

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

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 всегда не Assigned (т.е. = ноль) !!!!!

ПОЧЕМУ?

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

Энцо

+2

Пожалуйста, обновите ваш вопрос. Как бы то ни было, проблема не воспроизводится с кодом, который вы опубликовали. Обновите и исправьте свой вопрос. –

ответ

4

Если изменить код немного

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 error codes

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

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; 
+0

Исходный код вызывает StarUp в разделе инициализации и вызывает исключение, если он терпит неудачу. Что может быть основной причиной ошибки? – mjn

+0

@mjn Я не знаю; код инициализации работает и для меня. Должна быть какая-то локальная проблема в OP-коде, не показана в вопросе. – kludg

+0

Я пробовал ваше предложение, но у меня была ошибка # 11004 (запрашиваемое имя действительно, но не имеет IP-адреса на сервере имен) У вас есть идея? –