COM - Как получить свойства интерфейса в библиотеке типов, интерфейс определяется - PullRequest
0 голосов
/ 01 февраля 2010

Как получить свойства интерфейса в библиотеке типов, интерфейс определен, продолжает возвращать HRESULT, но хотел бы, чтобы он возвращал фактическое значение свойства.

EDIT:

IDL:

interface IMyClassInterface : IDispatch

{

[propget, id(1), helpstring("Gets user Type")] HRESULT getUserDefineTypeVal([out,retval] UserDefineEnum *ptrVal);

[propput, id(1), helpstring("Sets user Type ")]HRESULT setUserDefineTypeVal([in] UserDefineEnum newVal);

}

Свойство в заголовочном файле:

STDMETHOD(getUserDefineTypeVal)(UserDefineEnum *ptrVal);

STDMETHOD(setUserDefineTypeVal)(UserDefineEnum newVal);

Свойство в MYClass.cpp:

STDMETHODIMP CMYClass::getUserDefineTypeVal(UserDefineEnum *ptrVal) {

         *ptrVal = UserDefineEnum(private_var_UserDefineTypeVal);

            return S_OK;

    }



AnotherClass within the Type Library:

IMyClassInterface* private_var_MyClass



STDMETHODIMP CAnotherClass::someMethod(){

UserDefineEnum* p;

 if(private_var_MyClass->getUserDefineTypeVal(p)){

             //do somestuff



            }

}

Проблема в том, что условие if не возвращает true. Однако нижеследующее частично работает.

HRESULT hr = private_var_MyClass->getUserDefineTypeVal(p);

                        if(hr == S_OK){ do somestuff }

Проблема с этим заключается в том, что, если я пытаюсь использовать оператор case, единственным значением в hr является 0. Мне нужно проверить значение, устанавливаемое на стороне клиента.

Ответы [ 2 ]

2 голосов
/ 01 февраля 2010

Значение S_OK равно 0, поэтому ваш оператор if () не выполняется. Вы должны использовать макрос SUCCEEDED:

UserDefinedEnum value;
HRESULT hr = private_var_MyClass->getUserDefineTypeVal(&value);
if (SUCCEEDED(hr)) {
  switch (value) {
    // etc...
  }
}
else {
  // do something with the error...
}
0 голосов
/ 01 февраля 2010

COM обычно использует out параметры для возврата значений.В C / C ++ вы должны передать указатель на переменную, которая будет содержать результат при возврате.

Параметр возврата HRESULT используется только для сообщения об успешном (или неудачном) вызове метода.

РЕДАКТИРОВАТЬ Для вашего кода необходимо зарезервировать память для результата вызывающим абонентом :

UserDefineEnum p; // No * here ...
if (private_var_MyClass->getUserDefineTypeValue(&p) == S_OK) { // note '&' operator!
  switch (p) {
    case ENUM_1: // ... 
    case ENUM_2:
    // ...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...