在使用运行时许可证和加密狗运行 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(¶m, "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++ 中的许可错误。
要检查许可证是否可用,可以在应用程序开始时使用任何算子,然后检查结果。