65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (5投票s)

2003 年 5 月 10 日

CPOL

4分钟阅读

viewsIcon

197638

downloadIcon

1019

使用 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。

  • 将 MenuAddin.dll 放在 Notes 文件夹中。这将是 `DriveLetter:/Lotus/Notes`。
  • 通过在 `NOTES.INI` 文件中放置 AddinMenus 变量来配置 Notes 工作站。格式如下:
    AddinMenus = [<drive>]:[<directory>\<addname1.dll>,
        [<drive>]:[<directory>\<addname2.dll>
        ...
    
    如果 Dll 放在 Notes 文件夹内,则无需指定路径。在我们的例子中,它将是:
    AddinMenus = MenuAddin.dll
    
    如果有一个以上的 dll,您可以使用逗号分隔它们。

      就是这样!

      如果一切顺利,Notes 现在将在“操作”菜单中有一个新的菜单项。

      What Next?

      我们已经了解了如何在 Lotus Notes 的“操作”菜单中创建单个菜单插件。下一步将是创建多个插件菜单并处理每个插件菜单项的状态。
    • © . All rights reserved.