所以,如果我想写一个Xll并许可代码,那么我需要一个检查许可证文件的点,如果许可证无效,那么我希望Xll停止工作。
我看到xlAutoOpen看起来是检查许可证文件的好地方。我还看到xlAutoOpen必须根据文档返回1,如果返回1以外的其他内容会发生什么?我可以放弃Xll开放吗?我可以强行卸货吗?
是否有更好的地方检查许可证并拒绝操作。当然,我不必等到第一个工作表函数调用。
我目前不熟悉这个框架,原谅新手。
编辑:我想我可以拒绝调用xlfRegister。这将阻止操作。EDIT2:来自Excel SDK帮助文件
例如,xlAutoAdd ...可用于...检查许可信息。
另外,发现在MSDN xlAutoAdd
上答案 0 :(得分:1)
您应该检查xlAutoOpen
中的许可信息,因为此功能是激活XLL的第一个入口点,并且始终由Excel调用。如果密码无效,则返回0表示无法优秀和不注册UDF(在调用xlfRegister
之前退出)。
我注意到如果你注册你的UDF并且你返回0, xll仍然加载,UDF可用,所以返回 来自
xlAutoOpen
的变量似乎没有被考虑在内 Excel,但按照惯例,我认为最好保持返回零 表示失败。
我相信MSDN doc会产生误导。
xlAutoAdd
不适合检查许可证,因为当加载项管理器添加XLL或将文档作为文档打开时,它是一个可选功能,仅称为 (使用文件) /打开)。我假设您可能拥有试用许可证,因此如果用户的许可证仍然有效,您应该在每个加载时检查它。
示例强>
通常,您从xlAutoOpen
致电xlAutoAdd
,因此您的支票仍将完成:
伪代码:
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;
}
由于Excel始终调用xlAutoOpen
,因此您应该在其中执行类似的检查:
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要求的。我个人不使用这个功能。