2010-02-01 51 views
0

如何获得接口定义的类型库内接口的属性,返回HRESULT但希望它返回实际值的财产。COM - 如何获取接口定义的类型库中接口的属性

编辑:

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 



      } 

} 

的问题是如果条件不会返回true 。但下面的部分工作。

HRESULT hr = private_var_MyClass->getUserDefineTypeVal(p); 

         if(hr == S_OK){ do somestuff } 

这样做的问题是,如果我试图case语句在HR唯一的值是0,我需要检查在客户方所设置的值。

+0

你能否提供一些你认为应该工作的代码? – sharptooth 2010-02-01 15:17:01

+0

添加的代码,请检查 – 2010-02-01 16:20:46

回答

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

我认为你应该在'else'之前加一个'}'*并且在它之后去掉大括号...... – MartinStettner 2010-02-01 17:34:53

+0

修正了,谢谢你的提示。 – 2010-02-01 18:00:54

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

谢谢我得到你在说什么,但我已经添加了一些代码,以进入更多的细节。 – 2010-02-01 16:21:15