如何让 Xll 停止工作(如果许可证无效)?

How to make Xll stop working (if license is invalid)?

所以,如果我想编写一个 Xll 并许可代码,那么我需要一个点来检查许可文件,如果许可无效,那么我希望 Xll 停止工作。

我发现 xlAutoOpen 看起来是检查许可证文件的好地方。我还看到根据文档 xlAutoOpen 必须 return 1,如果 returned 不是 1 会怎样?我可以中止 Xll 打开吗?我可以强制卸载吗?

有没有更好的地方可以查证,拒绝营业。当然,我不必等到第一个工作表函数调用。

我目前不熟悉这个框架,所以请原谅新手。

编辑:我想我可以拒绝调用 xlfRegister。这将阻止操作。

EDIT2:来自 Excel SDK 帮助文件

xlAutoAdd ... can be used to ... check licensing information, for example.

此外,发现 MSDN xlAutoAdd

您应该检查 xlAutoOpen 中的许可信息,因为此函数是激活 XLL 的第一个入口点并且 总是 由 Excel 调用。如果密码无效,只需 returns 0 表示 excel 不注册您的 UDF(在调用 xlfRegister 之前退出)。

I have noticed that if you register your UDFs and that you returns 0 , the xll is still loaded and UDFs are available, so the return variable from xlAutoOpen does not seem to be taken into account by Excel but by convention I believe it is better to keep returning zero to indicate failure.

我认为 MSDN 文档具有误导性。 xlAutoAdd 不适合检查许可证,因为它是一个可选函数 只有 当插件管理器添加 XLL 或将其作为文档打开时才会调用 (使用 File/Open)。我假设您可能拥有试用许可证,因此如果用户的许可证仍然有效,您应该在每次加载时检查它。


例子

通常,您从 xlAutoAdd 调用 xlAutoOpen,因此您的检查仍会完成: 伪代码:

  int __stdcall xlAutoAdd(void)
  { 

   if(!Isinitialised) 
       if( xlAutoOpen() == 0) // licence check is still performed
         returns 0 ;
        ...

       MessageBoxA(GetActiveWindow(), "Thank you to install ...", "AutoOpen", MB_OK);

   Isinitialised = true;
 }

因为 xlAutoOpen 总是被 Excel 调用,你应该在其中执行类似的检查:

bool Isinitialised = false;
int __stdcall xlAutoOpen(void) // Register the functions
{

   if(Isinitialised)
      return 1;

   if(!ValidLicense()) // check licence in xlAutoOpen
      return 0;

    // continue initialization , registration ..

   .....
   Isinitialised = true;
  }

最后请注意,您可以省略 xlAutoAdd,因为它没有任何不良后果,而且 Excel 也不需要。我个人不使用这个功能。