C++ 处理com版本中可能不存在的函数
我有一个关于com处理的问题 我使用的是第三方dll,我通过#导入将其包括在内,并使用命名的#guids作为参数。我不知道是否应该使用另一个参数来正确导入 问题是dll有不同的版本。我正在使用的一个特定函数是在dll的最新版本中添加的。因此,如果一个客户有一个旧版本,则会有一个异常访问冲突执行位置(某个地址)。我知道错误告诉我无法找到函数,但如何捕获此异常 我尝试了try-catch(\u-com\u-error)-没有,try-catch(std::exception)-没有,甚至try-catch(…)-仍然没有 我是否可以捕获此类异常并记录异常并告诉客户dll有问题C++ 处理com版本中可能不存在的函数,c++,dll,error-handling,com,C++,Dll,Error Handling,Com,我有一个关于com处理的问题 我使用的是第三方dll,我通过#导入将其包括在内,并使用命名的#guids作为参数。我不知道是否应该使用另一个参数来正确导入 问题是dll有不同的版本。我正在使用的一个特定函数是在dll的最新版本中添加的。因此,如果一个客户有一个旧版本,则会有一个异常访问冲突执行位置(某个地址)。我知道错误告诉我无法找到函数,但如何捕获此异常 我尝试了try-catch(\u-com\u-error)-没有,try-catch(std::exception)-没有,甚至try-ca
我没有使用LoadLibrary和GetProcAddress。第三方DLL的开发人员违反了COM的核心原则:接口是不可变的。这意味着一旦发布,接口可能不会发生任何变化。您看到了当不遵循此规则时所产生的效果:对不存在的方法的调用会导致访问冲突 如果COM接口源于
IDispatch
,那么您有一种简单的方法来检查方法是否存在:用于获取该方法的DISPID
。如果不存在,函数将返回DISP_E_UNKNOWNNAME
错误:
DISPID dispID;
BSTR methodName = SysAllocString(L"MyMethod");
// Check hr return value
HRESULT hr = piDisp->GetIDsOfNames(IID_NULL, &methodName, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
SysFreeString(methodName);
第三方DLL的开发人员违反了COM的核心原则:接口是不可变的。这意味着一旦发布,接口可能不会发生任何变化。您看到了当不遵循此规则时所产生的效果:对不存在的方法的调用会导致访问冲突 如果COM接口源于
IDispatch
,那么您有一种简单的方法来检查方法是否存在:用于获取该方法的DISPID
。如果不存在,函数将返回DISP_E_UNKNOWNNAME
错误:
DISPID dispID;
BSTR methodName = SysAllocString(L"MyMethod");
// Check hr return value
HRESULT hr = piDisp->GetIDsOfNames(IID_NULL, &methodName, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
SysFreeString(methodName);
非常感谢:)这就是我所需要的。@Alex,那么你应该对违反这条规则的第三方开发人员进行严厉批评。这几乎是在COM中创建接口的第一步。没有借口。非常感谢:)这就是我所需要的。@Alex,那么你应该对第三方开发人员进行严厉批评,因为他们违反了这条规则。这几乎是在COM中创建接口的第一步。没有借口。