3.4 处理许可错误

在使用运行时许可证和加密狗运行 HALCON 时,HALCON 会定期检查加密狗是否仍然可用。这种检查对 HALCON 的性能没有明显影响。

为了在加密狗被移除且即将发生许可错误时获得通知,应用程序可以向 HALCON 注册一个回调函数,当 HALCON 检测到加密狗不再可用时,该函数将被调用。HALCON 算子将在该回调触发后约两到四分钟后因许可错误而失败。如果在此之前重新插入加密狗,HALCON 将继续正常运行。

请注意,如果您未注册回调,并且加密狗在运行期间不可用,HALCON 算子将因许可证错误而失败,因此无法提供有意义的输出参数。根据应用程序的不同,这甚至可能导致程序崩溃。强烈建议正确处理算子的错误,或注册回调以通知用户和/或以受控方式关闭应用程序。

要注册自己的回调函数,请在应用程序中使用以下代码:

void __stdcall MyLicenseRecheckFailedCallback(void *context, Herror error)
{
  <Add your application-specific callback code here.>
}

在应用程序启动代码的某处添加以下内容:

HSetLicenseRecheckFailedCallback(MyLicenseRecheckFailedCallback,
                                &MyLicenseRecheckFailedContext);

MyLicenseRecheckFailedContext 是一个用户自定义结构体,可用于向回调传递额外信息。如果不需要,可以传递一个 NULL 指针。

要取消注册回调,只需以 NULL 指针作为参数调用 HSetLicenseRecheckFailedCallback 即可。

请注意,回调不是链式的——注册一个回调将覆盖之前注册的任何回调。

例如,在您的应用程序中,您可以像这样执行适当的许可错误处理:

Herror error;
Htuple param, value;

create_tuple_s(&param, "version");
set_check("~give_error");
error = T_get_system(param, &value);
destroy_tuple(value);
destroy_tuple(param);

if ((error >= H_ERR_LIC_NO_LICENSE) && (error <= H_ERR_LAST_LIC_ERROR))
{
  /* Handle licensing error here. */
}

图 3.2:检查 C 中的许可错误。

try
{
  HalconCpp::HTuple value = HalconCpp::HSystem::GetSystem("version");
}
catch (HalconCpp::HException &exception)
{
  if (   (exception.ErrorCode() >= H_ERR_LIC_NO_LICENSE)
      && (exception.ErrorCode() <= H_ERR_LAST_LIC_ERROR))
  {
    // Handle licensing error here.
  }
}

图 3.3:检查 C++ 中的许可错误。

要检查许可证是否可用,可以在应用程序开始时使用任何算子,然后检查结果。