Sau khi đọc nhiều bài đăng trên StackOverflow về khuyết điểm của việc sử dụng tính toán tham chiếu tự động cho Giao diện, tôi bắt đầu cố gắng tham khảo thủ công đếm từng giao diện tức thời.Giao diện mà không cần tính tham chiếu
Sau khi thử một buổi chiều đầy đủ, tôi bỏ cuộc!
Tại sao tôi bị truy cập Vi phạm khi tôi gọi FreeAndNil (p)?
Dưới đây là danh sách đầy đủ đơn vị đơn giản của tôi.
unit fMainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm4 = class(TForm)
btn1: TButton;
procedure FormCreate(Sender: TObject);
procedure btn1Click(Sender: TObject);
end;
type
IPersona = interface(IInterface)
['{44483AA7-2A22-41E6-BA98-F3380184ACD7}']
function GetNome: string;
procedure SetNome(const Value: string);
property Nome: string read GetNome write SetNome;
end;
type
TPersona = class(TObject, IPersona)
strict private
FNome: string;
function GetNome: string;
procedure SetNome(const Value: string);
protected
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
public
constructor Create(const ANome: string);
destructor Destroy; override;
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.FormCreate(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown := True;
end;
procedure TForm4.btn1Click(Sender: TObject);
var
p: IPersona;
begin
p := TPersona.Create('Fabio');
try
ShowMessage(p.Nome);
finally
FreeAndNil(p);
end;
end;
constructor TPersona.Create(const ANome: string);
begin
inherited Create;
FNome := ANome;
end;
destructor TPersona.Destroy;
begin
inherited Destroy;
end;
function TPersona._AddRef: Integer;
begin
Result := -1
end;
function TPersona._Release: Integer;
begin
Result := -1
end;
function TPersona.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := S_OK
else
Result := E_NOINTERFACE;
end;
function TPersona.GetNome: string;
begin
Result := FNome;
end;
procedure TPersona.SetNome(const Value: string);
begin
FNome := Value;
end;
end.
+1 tôi không biết bạn chỉ có thể định kiểu một giao diện để một TObject. * (Chưa thử nghiệm nó, nhưng đến từ bạn, tôi giả sử nó là chính xác) * –
@Lieven Chỉ trong một số phiên bản Delphi gần đây hơn được hỗ trợ. Hoặc là năm 2009 hoặc 2010. Không thể nhớ chính xác khi nào. –
David cảm ơn bạn! giải pháp của bạn (cả hai) làm việc như một say mê (như đối với mỗi câu trả lời bạn đăng trên StackOverflow ;-)) GREAT !!!! –