【问题标题】:COM - How to get the properties of an interface within the type library the interface is definedCOM - 如何在定义接口的类型库中获取接口的属性
【发布时间】:2010-02-02 02:00:39
【问题描述】:

如何在定义接口的类型库中获取接口的属性,一直返回 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。我需要检查在客户端设置的值。

【问题讨论】:

  • 您能否提供一些您认为应该可以使用的代码?

标签: com interface


【解决方案1】:

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

【讨论】:

  • 我认为你应该在else 之前放置一个} 之前 并在它之后移除大括号...
【解决方案2】:

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

【讨论】:

  • 谢谢我明白你的意思,但我已经添加了一些代码来更详细地介绍。
猜你喜欢
  • 2021-01-18
  • 1970-01-01
  • 2021-06-28
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 2020-02-28
  • 2011-08-23
相关资源
最近更新 更多