Невозможно уничтожить компонент THTTPReqResp в потоке

У меня проблемы с использованием SOAP в XE / XE2 из потока. (Я не тестировал это с более старым Delphis.) Простой код, работающий в основном потоке, дает сбой при уничтожении экземпляра THTTPReqResp с Недействительной операцией указателя .

Это полная программа. Форма содержит только одну кнопку, которая запускает событие btnTestClick:

unit Unit79;

interface

uses
  SysUtils, Forms, Classes, Controls, StdCtrls, ComObj,
  ActiveX, InvokeRegistry, SOAPHTTPTrans, Rio, SOAPHTTPClient;

type
  TForm79 = class(TForm)
    btnTest: TButton;
    procedure btnTestClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form79: TForm79;

implementation

{$R *.dfm}

procedure TForm79.btnTestClick(Sender: TObject);
begin
  TThread.CreateAnonymousThread(
    procedure
    var
      FHTTPReqResp: THTTPReqResp;
      FHTTPRIO: THTTPRIO;
    begin
      if CoInitializeEx(NIL, COINIT_MULTITHREADED or COINIT_SPEED_OVER_MEMORY) = S_OK then try
        FHTTPReqResp := THTTPReqResp.Create(nil);
        with FHTTPReqResp do begin
          Name := 'HTTPReqResp1';
          UseUTF8InHeader := True;
          InvokeOptions := [soIgnoreInvalidCerts, soAutoCheckAccessPointViaUDDI];
          WebNodeOptions := [];
        end;
        FHTTPRIO := THTTPRIO.Create(nil);
        with FHTTPRIO do begin
          Name := 'HTTPRIO1';
          HTTPWebNode := FHTTPReqResp;
        end;
        //
        FreeAndNil(FHTTPRIO);
        FreeAndNil(FHTTPReqResp); //<-- crashes here
      finally CoUninitialize; end;
    end
  ).Start;
end;

end.

Исключение возникает в TObject.FreeInstance при вызове _FreeMem.

procedure TObject.FreeInstance;
begin
  CleanupInstance;
  _FreeMem(Self);
end;

Стек вызовов, приводящий к этой проблеме:

: 75bab9bc KERNELBASE.RaiseException + 0x58 System.TObject.FreeInstance
System.ErrorAt (2, $ 4052E1) System.Error (reInvalidPtr)
System.TObject.FreeInstance System._ClassDestroy (???)
Soap.SOAPHTTPTrans.THTTPReqResp.Destroy System.TObject.Free
frmMain.TMainForm.btnTestClick $ 4934 $ ActRec. $ 0 $ Body
System.Classes.TAnonymousThread.Execute
System.Classes.ThreadProc ($ F83530) System.ThreadWrapper ($ F51050)
: 76a4339a ядро32.BaseThreadInitThunk + 0x12: 77b59ef2
ntdll.RtlInitializeExceptionChain + 0x63: 77b59ec5
ntdll.RtlInitializeExceptionChain + 0x36

Я совершенно не понимаю, что происходит, почему вообще вызывается _ClassDestroy и почему происходит сбой кода :( Кто-нибудь, пожалуйста, а) объясните, что я делаю неправильно и б) исправьте мой код?

7
задан gabr 16 January 2012 в 19:47
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: