2

很抱歉不得不问这个问题,但我显然不了解 Delphi 的基本内容。

当您声明 TIdSSLIOHandlerSocketOpenSSL 之类的类的变量时,您必须将其初始化为什么?显然,如果它是一个字符串或一个整数,那么必要的值将是一个整数上的字符串,但在这种情况下它不太明显(对于像我这样无能的人)。不启动它会导致访问冲突,我理解为什么在 about.com上找到一篇关于它的文章,但该文章没有解释要启动什么。

下面是给出访问冲突的代码,因为我没有启动变量客户端(它是一个没有 gui 的应用程序)

program New;

uses
  Windows, Messages, SysUtils, Variants, Classes,
  Sockets, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
  IdServerIOHandler, IdSSL, IdSSLOpenSSL;


function Handshake(target: string; port: integer) : string;
var client: TIdSSLIOHandlerSocketOpenSSL;
begin
client.Create();
client.Port := port;
client.Destination := target;
client.Destroy;
end;


begin

  Handshake('127.0.0.1',15);

end.

为我的无知道歉,

ñ

4

1 回答 1

6

您需要使用语法TIdSSLIOHandlerSocketOpenSSL.Create调用构造函数并将结果保存到实例变量:

function Handshake(target: string; port: integer) : string;
var
  client: TIdSSLIOHandlerSocketOpenSSL;
begin
  client := TIdSSLIOHandlerSocketOpenSSL.Create;
  try
    client.Port := port;
    client.Destination := target;
    Result := ...;//don't forget to assign the return value to something
  finally
    client.Free;
  end;
end;

也用于try/finally在遇到异常时保护对象的生命周期。该finally块将始终执行,前提是执行通过了 try。

并且要销毁一个对象,您应该调用Free而不是Destroy. 这在这里无关紧要,但是当您在另一个对象的析构函数中销毁对象时非常重要。要了解有关Free我向您推荐(我知道的不谦虚)主题的更多信息,请参阅我的另一个答案

于 2012-04-07T16:38:23.667 回答