【问题标题】:tidssliohandlersocket segmentation fault with delphi xe7delphi xe7的tidssliohandlersocket分段错误
【发布时间】:2014-11-17 15:00:47
【问题描述】:

我已将以下代码作为 Android 应用程序构建并运行。 该应用程序按预期工作,但关闭时我在 TIdSSLIOhandler 中遇到分段错误。 Indy 组件是否与 FireMonkey 不兼容?

unit Main;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IdIOHandler,
  IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, FMX.Layouts, FMX.Memo,
  FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    http: TIdHTTP;
    ioSocket: TIdSSLIOHandlerSocketOpenSSL;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private

    LiServer:string;
    procedure DBCom(var retdata: TStringlist);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}
{$R *.LgXhdpiPh.fmx ANDROID}

procedure TForm1.Button1Click(Sender: TObject);
var m: TMemoryStream;
    retdata: TStringList;
    i:integer;
begin
  m:=TMemoryStream.Create;

  //--- init data
  retdata:=TStringList.Create;
  retdata.Add('F=1');

  //--- add data
  retdata.Add('Data=1');

  //--- send data to server database
  DBCom(retdata);

  for i := 0 to retdata.Count-1 do
    memo1.Lines.Add(retdata[i]);

  //--- free allocated resources
  retdata.Free;
  m.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var m: TMemoryStream;
    retdata: TStringList;
    i:integer;
begin
  m:=TMemoryStream.Create;

  //--- init data
  retdata:=TStringList.Create;
  retdata.Add('F=1');

  //--- add data
  retdata.Add('Data=A');

  //--- send data to server database
  DBCom(retdata);

  for i := 0 to retdata.Count-1 do
    memo1.Lines.Add(retdata[i]);

  //--- free allocated resources
  retdata.Free;
  m.Free;
end;

//============ communication with DB
procedure TForm1.DBCom(var retdata:TStringlist);
var m: TMemoryStream;
    errcode,i,msgid,status,id:Integer;
begin
  m:=TMemoryStream.Create;

  //--- send data to server database
  http.Post(LiServer, retdata, m);
  m.Position:=0;
  retdata.LoadFromStream(m);

  //--- free allocated resources
  m.Free;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  LiServer:='http://server.com/url.php';
end;

end.

此过程中 SSL_CTX_free(fContext) 行发生错误。

procedure TIdSSLContext.DestroyContext;
begin
  if fContext <> nil then begin
    SSL_CTX_free(fContext);
    fContext := nil;
  end;
end;

【问题讨论】:

  • Indy 与 FireMonkey 兼容,并且可以正常工作。甚至 Embarcadero 在他们自己的跨平台技术中也使用了 Indy。错误消息实际上说的是什么?引发错误时调用堆栈是什么样的?我怀疑您可能会遇到以下问题:AV in TIdStack.DecUsage() in Android 4.4.x
  • 感谢您的信息。然后我知道继续使用 Indy 组件是安全的。我已经更新了我的帖子,其中出现了分段错误。

标签: delphi firemonkey indy delphi-xe7


【解决方案1】:

@Remy Lebeau 在上面的注释中给出了我正在寻找的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多