如何在Delphi 2010中使用IFont和IStrings?

时间:2016-07-30 14:43:15

标签: delphi com marshalling delphi-2010


我想在Delphi 2010中编写一个DCOM客户端/服务器,它使用IStrings将Memo1.Lines(作为TStrings)作为测试服务器中的属性传递。服务器有一个TMemo组件,我想通过服务器的IMemoIntf设置或获取其Memo1.Lines属性。

1-In RIDL编辑器IStrings不被开箱即用的Delphi 2010接受。所以我首先注册了stdvcl40.dll并将其添加到"使用"编辑器的一部分,可以添加IStrings类型的属性。

2 - 然后我实现了两个函数Set_Text和Get_Text来设置和获取服务器的Memo1.Lines,如下所示:

procedure TMemoIntf.Set_Text(const Value: IStrings);
begin
  SetOleStrings(Form1.GetText, Value);
end;


function TMemoIntf.Get_Text: IStrings;
begin
  GetOleStrings(Form1.GetText, Result);
end;

IMemoIntf是TMemoIntf实现的接口。它自动定义如下:

// *********************************************************************//
// Interface: IMemoIntf
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {2B6BD766-5FB6-413F-B8E2-4AB05D87E669}
// *********************************************************************//
  IMemoIntf = interface(IDispatch)
    ['{2B6BD766-5FB6-413F-B8E2-4AB05D87E669}']
    function Get_Text: IStrings; safecall;
    procedure Set_Text(const Value: IStrings); safecall;
    property Text: IStrings read Get_Text write Set_Text;
  end;

和TMemoIntf如下:

TMemoIntf = class(TAutoObject, IMemoIntf)
protected
  function Get_Text: IStrings; safecall;
  procedure Set_Text(const Value: IStrings); safecall;
end;

在客户端我调用fMemo.Set_Text一切正常并且工作正常,客户端将服务器Memo1内容设置为自己的内容,但是当我调用fMemo.Get_Text时,为了获取服务器Memo1内容,我得到了以下错误消息。

Access violation at address ... in module 'combase.dll'.Read of address ...

客户端有一个显示服务器的私有字段fMemo和一个用于显示Set / Get_Text调用结果的Memo1。

TForm2 = class(TForm)
...
  btnSetText: TButton;
...
  btnGetText: TButton;
  Memo1: TMemo;
...
  procedure btnSetTextClick(Sender: TObject);
...
  procedure btnGetTextClick(Sender: TObject);
private
  fMemo : IMemoIntf;
end;

// it gives me the error
procedure TForm2.btnGetTextClick(Sender: TObject);
var
  Strings : IStrings;
begin
  Strings := fMemo.Get_Text;
  SetOleStrings(Memo1.Lines, Strings);
end;

// it works fine
procedure TForm2.btnSetTextClick(Sender: TObject);
var
  Strings : IStrings;
begin
  GetOleStrings(Memo1.Lines, Strings);
  fMemo.Set_Text(Strings);
end;

同样的想法适用于IFont,但是当我实现与TFont和TColor一样的工作时,OLE_COLOR正在完美地工作(我知道OLE_COLOR直接支持作为自动化编组类型,并且与两者不同)。
我做错了还是Delphi 2010中的东西? 如何使用IFont和IStrings缓解Delphi 2010中的问题?

1 个答案:

答案 0 :(得分:0)

好的,我发现了什么问题,是我。

“.ridl”文件的定义非常重要。对于“getter函数”,“out”参数应为“IStrings **”,对于“putter function”,它应为“IStrings *”。编译器自动更新“TLB”文件并向接口定义添加属性,并且通过之前的“IMemoIntf”实现,一切都很顺利。

我希望这对你有所帮助。我不知道如何追加,如果有兴趣的人告诉我如何追加整个项目,看看我做了什么。