2010-02-01 81 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

相關問題