xlAutoClose
任何时候XLL 被去激活都会调用此函数。当Excel会话正常结构时会去激活add-in。add-in 也可以由用户在Excel会话期间去激活,调用此函数。
Excel没有规定XLL必需实现和输出此函数,尽管它是明智的,如XLL去激活函数和命令,释放资源,撤销定制,等等。如果函数和命令没有由XLL明确要求释放,Excel会在调用xlAutoClose函数后,再进行此操作。
参数
此函数没有参数
属性值和返回值
你实现了此函数后,必需返回1(int)
备注
每当XLL从内存中卸载去激活后,Excel调用xlAutoClose函数。XLL会在以下情形中去激活:
- Excel会话正常结束时。
- 在Excel会话过程中明确卸载XLL
- XLL可以使用以下几种方法卸载
- 使用 Add-In 管理器。
- 从其它的XLL中调用 xlfUnregister函数,使用这个DLL做为唯一的参数名。
- 从XLM宏表中调用UNREGISTER,以这个DLL名称作为唯的参数名
这个函数可以作以下几种操作:
- 移除由这个XLL添加和菜单和菜单项。
- 执行任意必要的全局清理
- 删除任意创建的任意名称,尤其是函数输出的名称。这里需要注意的是注册的函数可能引起一些名称被创建,如果第4个参数 REGISTER 呈现出来。
实例
int WINAPI xlAutoClose(void)
{
int i;
XLOPER12 xRes;
//
// This block first deletes all names added by xlAutoOpen or
// xlAutoRegister12. Next, it checks if the drop-down menu Generic still
// exists. If it does, it is deleted using xlfDeleteMenu. It then checks
// if the Test toolbar still exists. If it is, xlfDeleteToolbar is
// used to delete it.
//
// The following code to delete the defined names
// does not work in the current version of Excel.
// You cannot delete these names once they are Registered.
// The code is left here in case the functionality becomes
// available in a future version.
//
for (i = 0; i < g_rgWorksheetFuncsRows; i++)
Excel12f(xlfSetName, 0, 1, TempStr12(g_rgWorksheetFuncs[i][2]));
for (i = 0; i < g_rgCommandFuncsRows; i++)
Excel12f(xlfSetName, 0, 1, TempStr12(g_rgCommandFuncs[i][2]));
//
// Everything else works as documented.
//
Excel12f(xlfGetBar, &xRes, 3, TempInt12(10), TempStr12(L"Generic"), TempInt12(0));
if (xRes.xltype != xltypeErr)
{
Excel12f(xlfDeleteMenu, 0, 2, TempNum12(10), TempStr12(L"Generic"));
// Free the XLOPER12 returned by xlfGetBar //
Excel12f(xlFree, 0, 1, (LPXLOPER12) &xRes);
}
Excel12f(xlfGetToolbar, &xRes, 2, TempInt12(7), TempStr12(L"Test"));
if (xRes.xltype != xltypeErr)
{
Excel12f(xlfDeleteToolbar, 0, 1, TempStr12(L"Test"));
// Free the XLOPER12 returned by xlfGetToolbar //
Excel12f(xlFree, 0, 1, (LPXLOPER12) &xRes);
}
return 1;
}