delphi6中COM的变化(100分)

  • 主题发起人 主题发起人 jy88jy
  • 开始时间 开始时间
J

jy88jy

Unregistered / Unconfirmed
GUEST, unregistred user!
请看:
《DELPHI深入COM》中以DELPHI5为基础,有一个范例,是用向导生成AUTOMATION OBJECT,
,给默认的接口添加一个METHOD,其返回类型不用默认的HRESULT,而是设为DOUBLE。
我现在用DELPHI6来做这个范例,但保存源代码时,提示我返回类型必须为HRESULT。

谁能解释一下?是不是BOLAND认为,自动化对象中接口的方法最好不是函数,不要用函数返回值来
回传数据,取而代之的是用参数回传数据?
 
同一本书里提到:
“自动化服务器中所有方法必须返回一个HRESULT,其他返回值必须在OUT参数中返回”
我真是糊涂了,难得糊涂哇!

一个方法可以返回一个HRESULT,还可以同时返回一个DOUBLE之类的值吗?
 
我用DELPHI5测试过了,还是提示:自动化服务器中的方法必须返回HRESULT。
 
jy88jy
书中也提到了,内部自动将Double以正常参数返回,HResult返回执行有无错误发生。
可我也想知道如何取得这个HResult返回值

密切关注
请高手解答
 
怎么没有人回答问题?
 
我不知道原因
反正method反回值固定为Hresult类型
要返回其它数据时用参数
如果把参返回参数设成out and var属性的话
在实现的代码中是这样:

Function Fun():boolean;

与普通的一样了
一直这样用
 
我刚才也在看这个问题,而且作者没有给出实例。我想必须返回hresult。
但返回必须用指针,又把我搞糊涂了,没有查到指针返回值。
 
to jy88jy

如果直接在return里写返回值的话,设置环境变量中type library的language为pascal

具体的区别,你在language的pascal与idl之间切换就明白了;

》》来自:jy88jy, 时间:2001-12-27 12:37:00, ID:816191
》》同一本书里提到:
》》“自动化服务器中所有方法必须返回一个HRESULT,其他返回值必须在OUT参数中返回”
》》我真是糊涂了,难得糊涂哇!
这是针对idl讲的

>>有一个范例,是用向导生成AUTOMATION OBJECT,
>>给默认的接口添加一个METHOD,其返回类型不用默认的HRESULT,而是设为DOUBLE。
这是针对pascal讲的

并不矛盾


 
看过一些C++的源代源,好像都有返回,但pascal常设为procedure ,反正能用.
 
COM的方法一定是返回HResult的,其中包含了远程异常的返回,
但Delphi提供了一种方法隐藏这一机制,在TypeLibrary中定义方法时增加一个返回参数,
如aResult,将其类型设置为你要返回的类型的指针类型,如double *,
再将其Options设置为Out和RetValue,刷新即可生成函数类型的方法。
 
D5默认用SafeCall,D6改用一般函数/过程,要自己实现SAFECALL:
加一个参数:aResult [out, retval]
Try
...
aResult := ...
Result := S_OK;
Except
On e : Exception Do
Result := SafeCallError( e, Self ); // 也可能是 SafeCallException ,我的D6帮助在98下有问题,查不到。
End;
 
让我来告诉你吧:
你在“TYPE LIBRARY”里面向接口添加方法,方法里面有参数,
参数有三项(NAME , TYPE , MODIFIER),你将MODIFIER选成RETVAL,
那么这个参数就成为此方法的返回值,也就是个函数了。
 
通过查看IDL就不难发现:
D6还是用stdcall 也会返回HRESULT
Type Libary工具中参数设为RETVAL,D6将把该参数做为参数表后的一项Out类型的参数,与HRESULT无关
HRESULT _stdcall SyncAuthCheckCode([in] BSTR TokenSN, [in] BSTR Response, [out, retval] long * ret );
 
生成之后,自己修改delphi生成的源代码就可以了。
 
后退
顶部