2017-08-08 68 views
1

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

我看到xlAutoOpen看起来是检查许可证文件的好地方。我还看到xlAutoOpen必须根据文档返回1,如果返回1以外的内容会发生什么?我可以放弃Xll开放吗?我可以强制卸载吗?

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

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

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

EDIT2:从Excel的SDK帮助文件

xlAutoAdd ......可以用来...查看许可信息,例如。

此外,发现在MSDN xlAutoAdd

回答

1

您应该检查许可信息xlAutoOpen,因为该功能是第一个切入点,以激活XLL是总是用Excel调用。如果密码无效,则返回0表示未能优于不注册您的UDF(退出前致电xlfRegister)。

我注意到,如果您注册了UDF和你返回0, 的XLL仍然加载和UDF是可用的,所以似乎从xlAutoOpen返回 变量不被 Excel中考虑但按照惯例,我认为最好保持返回零 表示失败。

我相信MSDN文档是有误导性的。 xlAutoAdd不适用于检查许可证,因为它是一个可选功能,只有在插入管理器添加XLL或将其打开为文档(使用文件/打开)时称为。我假设您可能拥有试用许可证,因此如果用户许可证仍然有效,则应在每次加载时检查它。


通常情况下,你从xlAutoAddxlAutoOpen你的支票仍然会做: 伪代码:

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所必需的。我个人不使用这个功能。