COM - 如何在定义接口的类型库中获取接口的属性

时间:2010-02-01 15:13:01

标签: com interface

如何在定义接口的类型库中获取接口的属性,保持返回HRESULT但希望它返回属性的实际值。

编辑:

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.我需要检查在clientside上设置的值。

2 个答案:

答案 0 :(得分:2)

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...
}

答案 1 :(得分:0)

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:
    // ...
  }
}