在 Lotus Notes 中使用 MFC/NotesAPI 添加插件菜单






3.50/5 (5投票s)
使用 Lotus C API 和 MFC 在 Lotus Notes 中创建插件菜单。
引言
这是一个简单的 dll 程序,用于使用 Lotus Notes C API 4.6.2 在 Lotus Notes 操作菜单中添加菜单。
使用代码
NotesAPI 中的菜单插件功能允许您自定义 Notes 操作菜单,以便用户可以通过选择添加的菜单项来运行您的 API 程序。本文将逐步介绍如何创建 Notes AddinMenu dll。
第一步:创建新工作区运行 VC 新建项目向导。选择“MFC AppWizard(dll)”并指定项目名称(例如,MenuAddin)。单击“确定”进入其他对话框,并在向导中选中“使用 MFC 静态链接的常规 Dll”选项。
第二步:工作区设置
1. 转到“项目设置”(ALT+F7)。在“C/C++”选项卡中的“预处理器定义”下,在预处理器列表末尾添加“NT”或“W32”。2. 在“链接”选项卡中。在“常规”下,在“输出文件名”中指定 `[NOTESPATH]\MenuAddin.dll`。“[NOTESPATH]”是 Notes 可执行文件在系统中的路径。例如,可能是 Drive:\Lotus\Notes。3. 对于“对象/库模块”,在字段中输入“notes.lib”。4. 转到“工具”->“选项”菜单。在“目录”选项卡中,选择“包含文件”,并指定 Notes API 包含目录的路径。例如,在我的情况下是 `D:\Notes C API 4.6\INCLUDE`。5. 选择“库文件”,并指定操作系统库文件的路径。例如,在我的情况下是 `D:\Notes C API 4.6\LIB\MSWIN32`。
第三步:编码
好了,现在我们已经完成了所有环境的设置。让我们开始编码部分。有两个头文件需要包含才能编译此 dll。
#include <global.h> #include <addinmen.h>`global.h` 包含全局信息,`addinmen.h` 包含创建插件菜单 dll 所需的结构。Dll 类现在没有任何入口点方法。NotesAddinMenu dll 必须具有此入口点。
extern "C" NAMRESULT LNCALLBACK ActionsMenuProc(WORD wMsg, PVOID pParam)
`wMsg` 表示一个插件菜单操作,`pParam` 将包含特定信息,具体取决于 `wMsg` 的值。
Notes 工作站会向 DLL 发送 4 种可能的 a 消息。这些消息定义在 `addinmen.h` 中。它们是 `NAMM_INIT`, `NAMM_INITMENU`, `NAMM_COMMAND` 和 `NAMM_TERM`。这些消息类型的完整参考可在 Notes API 参考中找到。ActionMenuProc 的完整代码如下:
WORD gwStartingID; extern "C" NAMRESULT LNCALLBACK ActionsMenuProc(WORD wMsg, PVOID pParam) { // This function is called three times. // 1. to init/to get the menu item name. // 2. to enable/disable menu based on the context // like view,doc,workspace // 3. to do the actual command work. switch (wMsg) { case NAMM_INIT: // Set up the new addin menu items { NAM_INIT_INFO* pInitInfo; pInitInfo = (NAM_INIT_INFO *) pParam; // Save the starting ID of the First item appended to menu if (pInitInfo->wMenuItemNumber == 0) /* first time through */ gwStartingID = pInitInfo->wStartingID; // Give Notes our menu id pInitInfo->wMenuID = IDS_MENU_NAME; // Give Notes our menu item name CString strAppName; strAppName.LoadString(IDS_MENU_NAME); _tcscpy(pInitInfo->MenuItemName, (LPCSTR)strAppName); return (NAM_INIT_STOP); } case NAMM_INITMENU: // Called each time Action Menu is dropped down { NAM_INITMENU_INFO* pInitMenuInfo; WORD wFlags; pInitMenuInfo = (NAM_INITMENU_INFO *) pParam; wFlags = MF_ENABLED | MF_BYCOMMAND; // Set Menu Item State EnableMenuItem(pInitMenuInfo->hMenu, gwStartingID + IDS_MENU_NAME, wFlags); } return (NAM_NOERROR); case NAMM_COMMAND: // Called when user clicks the Menu Item { // do the actual command work here CString strAppName; strAppName.LoadString(IDS_APP_NAME); AfxMessageBox("Menu Item Clicked",IDS_APP_NAME,MB_OK); return (NAM_NOERROR); } case NAMM_TERM: default: return (NAM_NOERROR); } }
描述
这看起来并不复杂。Notes API 提供了许多结构。我建议您参考 Notes API 参考以获取有关这些结构的更多信息。首先,`NAMM_INIT` 通知 DLL 需要使用插件程序中定义的菜单项来初始化 Notes Client 操作菜单。遇到此消息时,您的程序应使用 `NAMM_INIT_INFO` 结构初始化菜单。NAM_INIT_INFO* pInitInfo; pInitInfo = (NAM_INIT_INFO *) pParam; // Save the starting ID of the First item appended to menu if (pInitInfo->wMenuItemNumber == 0) /* first time through */ gwStartingID = pInitInfo->wStartingID; // Give Notes our menu id pInitInfo->wMenuID = IDS_MENU_NAME; ..... _tcscpy(pInitInfo->MenuItemName, (LPCSTR)strAppName);`wStartingID` 是第一个插件菜单项的 Notes ID。程序必须在第一次处理该消息时保存起始 ID。`wMenuID` 是分配给每个插件菜单的值。`MenuItemName` 是要在菜单中显示的字符串,作为菜单选项名称。
每次在 Lotus Notes 中选择操作菜单项时,都会向 DLL 发送 `NAMM_INITMENU` 消息。这是我们启用、禁用、选中或灰色化插件菜单项的地方。这通过 `NAM_INITMENU_INFO` 结构完成。
NAM_INITMENU_INFO* pInitMenuInfo;
WORD wFlags;
pInitMenuInfo = (NAM_INITMENU_INFO *) pParam;
wFlags = MF_ENABLED | MF_BYCOMMAND;
// Set Menu Item State
EnableMenuItem(pInitMenuInfo->hMenu, gwStartingID
+ IDS_MENU_NAME, wFlags);
当用户从“操作”菜单中选择插件菜单项时,会向 DLL 发送 `NAMM_COMMAND` 消息进行处理。DLL 填充 `NAM_COMMAND_INFO` 结构。从该结构中,您可以继续调用适合所选菜单项的函数和其他 API 程序。在此示例中,我没有填充 `NAM_COMMAND_INFO` 结构,因为我们只创建一个插件菜单。在添加多个插件菜单的情况下,可以使用结构值来确定调用了哪个插件菜单。
在 `NAMM_COMMAND` 中完成所有处理后,应始终返回 `NAM_NOERROR`。
配置 Notes
您必须确保在 `.def` 文件的 EXPORTS 部分声明 `AddinMenuProc` 并为其分配序数值 1。然后将程序编译成 dll。完成此操作后,您需要按照以下步骤配置 Notes,使其在 Notes 启动时加载 DLL。
AddinMenus = [<drive>]:[<directory>\<addname1.dll>, [<drive>]:[<directory>\<addname2.dll> ...如果 Dll 放在 Notes 文件夹内,则无需指定路径。在我们的例子中,它将是:
AddinMenus = MenuAddin.dll如果有一个以上的 dll,您可以使用逗号分隔它们。