请教一个Automation Object的错误(返回值)(50分)

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
我在看《Delphi COM深入编程》一书时遇到这样一个问题,书上的一个例子,将接口的方法返回值类型HRESULT改成了其他的类型
代码如下:
接口的代码:
IMemoIntf=interface(IDispatch)
['{A1E420C8-F75F-11D2-B3B9-004-F67455FE}']
function Get_Color:OLE_COLOR;safecall;
procedure Set_color(Value:OLE_COLOR);safecall;
function Get_Font:IFontDisp;safecall;
procedure Set_Font(const Value:IFontDisp);safecall;
......
end;
我在type Library中加上上述二个属性color,font,并指定其方法的返回值类型时报错:
function of automation interfaces must have a return type of HRESULT
后来我按Delphibbs论坛上的一些贴子中提到的方法添加参数,并加上了*号,而函数的返回值类型改成了HRESULT,
但刷新实现时,又报错:Out parameter requires pointer type
实在不知该如何创建这个自动化对象的属性,还请各位大富翁帮忙看看。
 
声明啊,那个书不适合DELPHI6/7版本。。

你在写参数的时候,尽量不要修改type libary中的上面的HRESULT。。
你如果要返回参数,需要在下面指定。。。
比如添加一个参数ret ,返回是一个IFontDisp.设定为输出参数就可以了。。。

要不你无法保存这个类型库。。。
 
蓝大侠,我后来是将返回值类型改回了HRESULT,并添加了一个参数Value,返回的是一个IFontDisp * ,并设置为[out,retval],我按刷新实现那个按钮后,报错:
Out parameter requires pointer type
所以我怀疑是不是因为参数的返回类型是不是有影响,因为在参数类型这个地方的下拉菜单下没有IFontDisp *这个类型。

后来我将这二个返回的参数后来的[out,retval]去掉,则刷新成功了。
但接口定义成了:
IMemoIntf = interface(IDispatch)
['{101DE19D-BE96-4AF4-9969-E1245627FCD3}']
function Get_Color: OLE_COLOR; safecall;
procedure Set_Color(var Value: OLE_COLOR); safecall;
function Get_Font: HResult; safecall;
procedure Set_Font(const Value: IFontDisp); safecall;
function Get_Text: HResult; safecall;
procedure Set_Text(const Value: IStrings); safecall;
end;
二个Get_Font,Get_Text就不能取得正常的结果
 
那本书是针对Delphi3,4,5的
Delphi7返回值必须是HResult
如果方法为函数,那么参数设置为Result,返回类型设置为[out,retval]
是过程,参数按照实际要求

这是因为自动化和以后的MTS,COM+必须按照他指定的类型,不兼容很多Delphi的类型造成的
是在不行我就使用Variant

你上面刚提到的问题,把IFontDisp *改为IFontDisp **就可以
 
惭愧,我忘记了,我看看了我作的一个例子也是一样。。我都不知道当时怎么作的。。。

我打开我成功的例子,居然没有什么问题。不过保存也是这样的提示。。。

我当时怎么避免的这个提示保存这个类库的呢?唉。。。。。

我考虑了一下后,感觉我要作这个例子才不用这个IFONTDISP,直接使用IFONT.
 
十分感谢二位大哥大侠的指点!谢谢!
 
后退
顶部