高分求助:C++Builder5.0中事件参数定义为[out]参数时为何不起作用?(问题解决再加100)

lhynew 2003-02-19 04:18:34
例子:
类型库中的事件定义:
void OnError([in] int nSessionID, [in] VARIANT * Data, [in] unsigned long nType, [in] long nState, [in] long nErrorCode, [out] int * nTimeOut );
按理在事件处理函数中修改*nTimeOut会把修改后的值传回COM内部,但实际却遇到问题。
如:
事件处理函数为:
void OnHandleError(int nSessionID, VARIANT * Data, unsigned long nType, long nState, long nErrorCode, int * nTimeOut)
{
//显示*nTimeOut值,如果Fire_OnError之前为10,则此处显示正确(对应COM内部实现)
*nTimeOut = 0;//修改*nTimeOut的值,但是在COM内部没有变化。
}
COM内部为:
int nTimeOut;
nTimeOut = 10;
Fire_OnError(GetSessionID(), &aVariant, Type,
nState, nErrorCode, &nTimeOut);
nTimeOut 仍然为10,不是上述事件处理函数中改过的值 0, 所以肯定有问题。我尝试把[OUT]改为[in,out]仍然无效。

但是,通用的定义,如果不是定义成事件,则输出参数可以起作用。
类似定义在Delphi5.0则可以起作用。
怀疑:
1.内部实现时采用指针拷贝
2.marshing和unmarshing出错
请各路高人指点迷津
...全文
62 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhynew 2003-04-07
  • 打赏
  • 举报
回复
谢谢各位的支持,虽然问题没有解决,为答复各位,现在散分了!
kingcaiyao 2003-03-19
  • 打赏
  • 举报
回复
To lhynew:
加上一行return S_OK看看
lhynew 2003-03-06
  • 打赏
  • 举报
回复
WhyAndAnswer:
这个帖子关注的是接口函数的返回值问题,似乎跟我现在关心的事件调用中的输出参数有些区别。按理应该没有区别的,这就是我不明白的地方。
WhyAndAnswer 2003-03-04
  • 打赏
  • 举报
回复
看一下那个帖子
http://expert.csdn.net/Expert/topic/1465/1465286.xml?temp=.6031916
主  题: Wingsun,AKing,猛禽等COM方面的高手请进:为什么COM接口函数中的返回变量的指针为BSTR*可以,但是LPSTR*却不能正确返回COM服务器的值??
作  者: lluunn007 (书生)
等  级:
lhynew 2003-03-04
  • 打赏
  • 举报
回复
kingcaiyao(AKing):有没有办法解决?
lhynew 2003-03-04
  • 打赏
  • 举报
回复
to appleIIappleII,你的使用方法可能与我的有出入。你的用法是直接调用接口,这没有问题,我的问题中已经说过。
按照我程序的需要,你例子中应作这样的调整:void OnHandleError (int *nTimeOut)在服务端是为引发客户端事件;
因此服务端应这样使用OnHandleError:
int nTimeOut = 40;
(接口对象)->Fire_OnHandleError (&nTimeOut);
if (nTimeOut != 40)
{
『表明客户端改变nTimeOut』成功
}
客户端的OnHandleError事件使用
TAnyClass::OnHandleError (int *nTimeOut)
{
*nTimeOut = 9;
}
kingcaiyao 2003-02-28
  • 打赏
  • 举报
回复
贴主说的问题的确也存在,不仅是在事件中,就是在接口中定义方法时也会出现这个问题,在客户端调用时out参数值没有被改变。
lhynew 2003-02-28
  • 打赏
  • 举报
回复
没错,按你所说,我也期望显示的结果为40,但实际显示的结果仍然为9,你说什么原因?
appleIIappleII 2003-02-28
  • 打赏
  • 举报
回复
我这里没有问题,答案是40,你可将我的例子放在你的程序中试一试。应该没问题的。或将你的程序发给我
appleIIappleII 2003-02-27
  • 打赏
  • 举报
回复
我搞不清你的内部与外部,我的方法如下(举例)
服务端
void OnHandleError(int * nTimeOut)
{
*nTimeOut=40;
}
客户端的调用
int TimeOut=9;
//绑定接口,调用COM
COM。OnHandleError(&TimeOut);
ShowMessage(TimeOut);//显示为40



appleIIappleII 2003-02-26
  • 打赏
  • 举报
回复
BCB与DELPHI的类型不一样,你把服务端程序及客户端的调用贴出来,我帮你看一下
lhynew 2003-02-26
  • 打赏
  • 举报
回复
我问题中的代码是从服务端程序及客户端程序中剪贴出来的。
叶子哟 2003-02-25
  • 打赏
  • 举报
回复
没做过事件,你看看吧:
http://raptorz.myetang.com/mentals/tech/tech.htm
lhynew 2003-02-25
  • 打赏
  • 举报
回复
难道没有高手路过?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧