В C++ Builder XE7, я создал простой объект автоматизации COM:C++ Builder ActiveX получить метод свойство переполнения
- File> New> ActiveX> ActiveX библиотеки
- File> New> ActiveX> Automation Object
- Добавить новое свойство MyProperty
- Push 'Refresh' реализацию
Итак, мастер создал деклараций/implementat Ионы для получения/установки методов:
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;
}
Getting значение свойства в клиентском приложении, функция сервера TMyObjectImpl :: get_MyProperty (long * Value), похоже, работает рекурсивно, пока не будет переполнено стеком.
Вот простой код клиента:
Variant Object;
double N;
V = Variant::CreateObject("MyProject.MyObject");
N = V.OlePropertyGet("MyProperty");
Что я делаю неправильно в этом задании?
*Value = MyProperty;
Обращаясь к 'MyProperty', вызывается метод getter (' get_MyProperty'), определенный для свойства. Очевидно, что если вы делаете это из 'get_MyProperty', вы вызываете бесконечную рекурсию. Обычно вы объявляете частное поле, используемое для хранения значения вашего свойства, и записываете метод getter, чтобы вернуть значение этого частного поля. –
Итак, я должен определить поле для хранения данных свойства, а не самого свойства. Спасибо! – Giovanni