Tôi gặp sự cố khi sử dụng SOAP trong XE/XE2 từ một chuỗi. (Tôi đã không kiểm tra nó với Delphis cũ hơn.) Một mã đơn giản hoạt động trong các lỗi chính trong khi phá hủy cá thể THTTPReqResp với Invalid pointer operation
.Không thể hủy thành phần THTTPReqResp trong một chủ đề
Đây là chương trình hoàn chỉnh. Biểu mẫu chỉ chứa một nút kích hoạt sự kiện 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.
Ngoại lệ được nêu ra trong TObject.Miễn phí trong cuộc gọi _FreeMem.
procedure TObject.FreeInstance;
begin
CleanupInstance;
_FreeMem(Self);
end;
Cuộc gọi chồng dẫn đến vấn đề này là
: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 kernel32.BaseThreadInitThunk + 0x12 :77b59ef2 ntdll.RtlInitializeExceptionChain + 0x63 :77b59ec5 ntdll.RtlInitializeExceptionChain + 0x36
Tôi hoàn toàn không có ý tưởng những gì đang xảy ra, tại sao _ClassDestroy được gọi là chút nào và lý do tại sao mã treo :(Can ai đó xin vui lòng a) giải thích những gì tôi đang làm sai và b) sửa mã của tôi?
D2010 chưa có CreateAnonymousThread. Đang cố gắng không ẩn danh ngay bây giờ. Không có sự cố với chuỗi không ẩn danh. –
Luồng không phải là vấn đề ở đây (tôi nghĩ). Nó bị treo cùng với OmniThreadLibrary (đó là cách tôi tìm thấy vấn đề này). – gabr
Từ tài liệu của THttprio "Khi nó được tạo với tham số nil (Delphi) hoặc NULL (C++), nó sẽ tự động hủy khi số tham chiếu giảm xuống 0". Bạn đang giải phóng nó một cách rõ ràng. –