如何在定义接口的类型库中获取接口的属性,保持返回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上设置的值。
答案 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:
// ...
}
}