Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 处理com版本中可能不存在的函数_C++_Dll_Error Handling_Com - Fatal编程技术网

C++ 处理com版本中可能不存在的函数

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

我有一个关于com处理的问题

我使用的是第三方dll,我通过#导入将其包括在内,并使用命名的#guids作为参数。我不知道是否应该使用另一个参数来正确导入

问题是dll有不同的版本。我正在使用的一个特定函数是在dll的最新版本中添加的。因此,如果一个客户有一个旧版本,则会有一个异常访问冲突执行位置(某个地址)。我知道错误告诉我无法找到函数,但如何捕获此异常

我尝试了try-catch(\u-com\u-error)-没有,try-catch(std::exception)-没有,甚至try-catch(…)-仍然没有

我是否可以捕获此类异常并记录异常并告诉客户dll有问题


我没有使用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中创建接口的第一步。没有借口。