在C++Builder XE7中,我创建了一个简单的COM自动化对象:
- 文件>新建>ActiveX>ActiveX库
- 文件>新建>ActiveX>自动化对象
- 添加新属性MyProperty
- 推送"刷新实现"
因此,向导为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
是类的成员字段。