C++Builder ActiveX获取属性方法溢出



在C++Builder XE7中,我创建了一个简单的COM自动化对象:

  1. 文件>新建>ActiveX>ActiveX库
  2. 文件>新建>ActiveX>自动化对象
  3. 添加新属性MyProperty
  4. 推送"刷新实现"

因此,向导为get/set方法创建了声明/实现:

interface IMyObject: IDispatch
{
  [propget, id(0x000000CA)]
  HRESULT _stdcall MyProperty([out, retval] long* Value);
  [propput, id(0x000000CA)]
  HRESULT _stdcall MyProperty([in] long Value);
  };
STDMETHODIMP TMyObjectImpl::get_MyProperty(long* Value)
{
  try
  {
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IMyObject);
  }
  return S_OK;
}
// ---------------------------------------------------------------------------
...

为了获得自动化客户端的属性值,我插入了将属性值分配给参数引用的值的代码:

STDMETHODIMP TMyObjectImpl::get_MyProperty(long* Value)
{
  try
  {
    *Value = MyProperty;
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IMyObject);
  }
  return S_OK;
}

在客户端应用程序中获取属性值时,服务器函数TMyObjectImpl::get_MyProperty(long*value)似乎会递归运行,直到出现堆栈溢出。

这里有一个简单的客户端代码:

Variant Object;
double N;
V = Variant::CreateObject("MyProject.MyObject");
N = V.OlePropertyGet("MyProperty");

我这次作业做错了什么?

*Value = MyProperty;
STDMETHODIMP TMyObjectImpl::get_MyProperty(long* Value)
{
  try
  {
    *Value = MyProperty;
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IMyObject);
  }
  return S_OK;
}

读取CCD_ 1是通过对CCD_ 2的调用来实现的。因此产生了未终止的递归。

您需要通过返回通过其他方式获得的值来实现get_MyProperty。例如,您可能会返回一个常数值:

*Value = 42;

或者,您可以返回存储在成员字段中的值:

*Value = myPropertyValue;

其中myPropertyValue是类的成员字段。

最新更新