2015-11-02 3 views
-1

В C++ Builder XE7, я создал простой объект автоматизации COM:C++ Builder ActiveX получить метод свойство переполнения

  1. File> New> ActiveX> ActiveX библиотеки
  2. File> New> ActiveX> Automation Object
  3. Добавить новое свойство MyProperty
  4. 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; 
+1

Обращаясь к 'MyProperty', вызывается метод getter (' get_MyProperty'), определенный для свойства. Очевидно, что если вы делаете это из 'get_MyProperty', вы вызываете бесконечную рекурсию. Обычно вы объявляете частное поле, используемое для хранения значения вашего свойства, и записываете метод getter, чтобы вернуть значение этого частного поля. –

+0

Итак, я должен определить поле для хранения данных свойства, а не самого свойства. Спасибо! – Giovanni

ответ

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

Чтение MyProperty осуществляется с помощью вызова get_MyProperty. Следовательно, это не искорененная рекурсия.

Вам необходимо реализовать get_MyProperty, возвращая значение, полученное другими способами. Например, вы можете вернуть постоянное значение:

*Value = 42; 

Или вы можете вернуть значение, хранящееся в поле члена:

*Value = myPropertyValue; 

где myPropertyValue является полем члена вашего класса.

+0

Теперь мне все ясно. Большое спасибо! – Giovanni

Смежные вопросы