複製鏈接
請複製以下鏈接發送給好友

Extension Manager

鎖定
Extension Manager 是 Lotus C API 提供的一個功能非常強大的設計機制,它允許應用程序設計者向 Notes/Domino 系統註冊自己感興趣的事件,例如:EM_NSFDBCLOSESESSION、EM_NSFDBCLOSE 等。從而在 Notes/Domino 進行內核操作之前(或者之後,取決於在事件註冊中使用的是 EM_REG_BEFORE 還是 EM_REG_AFTER)來運行自己設計的特製插件程序
Extension Manager 可以無限擴充Dreamweaver功能,Extension Manager可以説是Dreamweaver的plug-in管理員,可以下載各種的plug-in加入Dreamweaver,還可以自己設計製作,讓Dreamweaver的功能更強大。 Extension Manager 插件程序的設計框架要符合一定的規則,這樣才能被 Notes/Domino 系統在合適的時機調用。
軟件名稱
Extension Manager
軟件語言
英文
軟件類別
國外軟件 / 主頁製作
應用平台
Win9x/NT/2000/XP/2003

Extension Manager重要要素

(1)DLL 入口函數
Extension Manager Extension Manager
Extension Manager 插件程序必須被編譯為可執行的程序庫(例如,Windows 系統的動態鏈接庫 dll 或者是 UNIX 系統的 shared object)。程序庫的結構和命名規則是跟平台相關的,詳細信息請參考 Lotus C API 用户手冊第十二章第二節:"Platform-Specific Naming Conventions" 。在 DLL 入口函數中,應當完成插件程序實例的創建和釋放,並且負責在插件程序退出之前,註銷向 Notes/Domino 系統註冊的 EM_XX 事件。
(2)插件程序入口函數
該函數是定製插件程序的入口函數,EM事件的註冊過程將會在此函數中加以實現。該函數聲明格式如下所示
STATUS LNPUBLIC MainEntryPoint (void);
該入口函數的名字可任意給定,但是必須在模塊定義文件(.def文件)中將其聲明為導出函數(EXPORTS function),並且導出序號為1。
例子:
LIBRARY nextmngr INITINSTANCE EXPORTS MainEntryPoint@1
在註冊回掉函數之前,推薦使用 EMCreateRecursionID() 函數,這樣可以防止一個插件程序被多次調用。
Extension Manager Extension Manager
插件程序回調函數:該函數是 Extension Manager 插件程序的業務處理函數,負責在收到註冊事件通知後進行定製處理。

Extension Manager運行條件

要想運行一個定製的 Extension Manager 程序,需要做兩件事情:
將編譯成功的 DLL文件放在 Notes/Domino 的主目錄下
修改 notes.ini 文件,增加一個變量如下所示
EXTMGR_ADDINS=NEXTMNGR
如果有多個插件程序,在插件程序名之間用逗號格開。如果多個插件程序註冊了同一個事件,則按照 notes.ini 文件中的插件程序的註冊順序來依次進行處理。
Extension Manager Extension Manager
在瞭解了以上基礎知識之後,我們將以 Windows 平台為例,給出一個簡單而典型的 Extension Manager程序結構,本示例程序只是用來説明 Extension Manager 的程序架構和處理邏輯,不能編譯運行,具體的 Extension Manager 示例程序,請參考隨 Lotus C API 一起發佈的 Sample。

Extension Manager結構示例

/* Extension Manager程序結構示例*/
/*system header file*/
#include <stdlib.h> ……
/*Notes Domino Header File*/
#include <global.h> ……
/*========================== GLOBAL VARIABLES ==============================*
HEMREGISTRATION hHandler; //插件程序上下文句柄
EMHANDLER gHandlerProc; //插件程序回調函數句柄
WORD gRecursionID; //防止該程序被多次調用
CRITICAL_SECTION gCriticalSection; // 用於多線程同步
/*================== LOCAL FUNCTION PROTOTYES ===============================*/
STATUS LNPUBLIC MainEntryPoint( void ); //插件程序入口函數
STATUS LNPUBLIC EMHandlerProc( EMRECORD FAR * pExRecord); // 插件程序回調函數 BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD fdwReason, LPVOID lpReserved ); // DLL入口函數
/*===========================================================================*/
STATUS LNPUBLIC MainEntryPoint( void )
{ STATUS error= NOERROR;
error = EMCreateRecursionID( &gRecursionID );
error = EMRegister(EM_GETPASSWORD, EM_REG_BEFORE | EM_REG_AFTER,(EMHANDLER)gHandlerProc, gRecursionID, &hHandler);
return( error ); }
/*==========================================================================*/
STATUS LNPUBLIC EMHandlerProc( EMRECORD FAR * pExRecord )
{ STATUS error = 0; switch(pExRecord->EId)
{ case EM_GETPASSWORD: { return(ERR_BSAFE_USER_ABORT ); }
return error; }
/*============================================================================*/
BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD fdwReason, LPVOID lpReserved )
{ STATUS error=NOERROR; switch(fdwReason)
{ case DLL_PROCESS_ATTACH: InitializeCriticalSection(&gCriticalSection);
gHandlerProc = (EMHANDLER)MakeProcInstance((FARPROC)EMHandlerProc, hInstance);
break;
case DLL_PROCESS_DETACH:
error = EMDeregister(hHandler);
FreeProcInstance( gHandlerProc );
DeleteCriticalSection(&gCriticalSection);
break; }
return( TRUE );
UNREFERENCED_PARAMETER(lpReserved); }

Extension Manager工程實例

接下來,將介紹 Extension Manager 的一個工程實例,並希冀由這個工程實例對 Lotus C API 應用程序開發者在使用 Extension Manager 實現定製應用程序時給予一定的啓發和指導。
(1)工程背景
某客户為了加強內部辦公環境的管理,需要強制用户加入 Windows 特定域。客户希望採取綁定郵件系統訪問的方式:即限制用户只有登錄 Windows 域後才可以訪問郵件系統。
(2)工程設計
為實現客户需求,我們可以設想在客户端部署一個 EM 程序。該客户端 EM 程序註冊 EM_GETPASSWORD 事件,在Notes彈出密碼輸入對話框之前判斷當前 Windows 用户是否在域中,如果不在域中就返回 ERR_BSAFE_USER_ABORT,這樣可以阻止 Notes 客户端連接 Domino Server。程序片斷請參考 Extension Manager 程序結構示例。
一切進行的很順利,似乎工作到此已經萬事大吉了。然而且慢,如果仔細考慮一下,這種方案是不可取的,如果客户端不安裝這個EM程序怎麼辦?或者如果用户卸載這個 EM 程序的話怎麼辦?這樣的話客户端完全可以繞開認證過程。
所以我們必須考慮在服務器端進行統一的控制,這就需要在服務器端也部署一個 EM 程序。該服務器 EM 程序註冊 EM_SECAUTHENTICATION 事件,對每位向郵件服務器發送訪問請求的用户進行實時授權鑑別,只有在客户端登錄 Windows 域的情況下,服務器端 EM 進程才開啓該用户訪問郵件服務器的限制。
服務器端 EM 程序如何鑑別來訪客户端是否在 Windows 域中?答案是 Socket 通信方法:客户端 EM 程序在經過相關判斷之後,把 Notes 用户的信息寫入到安裝 Domino Server 的服務器的某個文件(如Info.DAT)中,服務器端 EM 程序在認證來訪 Notes 用户的時候查詢該文件,如果發現來訪 Notes 用户信息在 Info.DAT 文件中存在,則授權該用户訪問郵件服務器,否則則拒絕其訪問。
(3)模塊設計與實現
系統分為三個組件,分別是:Notes 、客户端和EM 組件。
Notes 客户端 EM 組件
功能説明:負責判斷當前 Notes 用户的 Windows 域信息,並把相關信息發送給通信服務器,在接收到通信服務器的確認信息之後,更新登陸時間窗信息。(時間窗是一個時間段,某 Notes 客户端在域中登陸 Domino Server 之後,允許在時間窗內該 Notes 客户端不登陸域也能訪問郵件服務器
算法如下:
I. 捕獲 EM_GETPASSWORD 消息
II. 讀取註冊表的內容,取得當前時間跟註冊表中上一次登記的時間做比較,判斷時間窗是否過期。
III. 如果時間窗未過期,即該 Notes 客户端已經在指定時間段內向 Server 註冊過了,則直接返回 ERR_EM_CONTINUE. 把控制權交給 Notes,允許其連接郵件服務器
IV. 如果時間窗過期,判斷當前 Windows 用户否在域中,如果在域中,從註冊表中讀取通信服務器的 IP 和端口,把 Notes User 的信息發送過去,然後等待 Server 的響應。如果收到 Server 的響應,那麼更新註冊表中日期表項
V. 如果當前 Windows 用户不在域中,説明在時間窗之內沒有人在域中登陸過 Domino Server,返回 ERR_BSAFE_USER_ABORT 阻止 Notes 連接郵件服務器
Domino 服務器端 EM 組件
功能説明:捕獲當前試圖連接自己的 Notes 用户,讀取用户信息文件,判斷該當前用户是否為合法用户,從而決定是否授權該用户訪問郵件服務器。
算法如下:
I. 註冊 EM_SECAUTHENTION 事件
II. 在事件發生時獲取當前申請連接的用户名字
III. 查詢用户信息文件,若有跟當前用户匹配的信息,説明該用户是合法用户,返回 ERR_EM_CONTINUE 將控制權交給 Domino Server。否則,返回 ERR_SECURE_FAILED_AUTH,拒絕該用户的連接請求。
通信服務器程序
功能説明:負責讀取所有客户端發送給自己的用户名信息,保存在用户信息文件中。以備 Domino Server 側的 EM 程序訪問。
該通信服務器是一個多線程併發程序,具備了四個模塊,分別是:
(a) 處理服務器模塊
功能説明:負責整個通信服務器程序的啓動和中止,並記錄整個系統的 Log 信息
(b) 消息件模塊
功能説明:該模塊由處理服務器模塊啓動,在啓動的時候啓動了三個線程,分別是:
接收消息線程:該線程啓動通信模塊,並等待通信模塊的消息,如果通信模塊通知該線程有消息到達,那麼去獲得該消息並寫入接收消息隊列裏面
處理消息線程:該線程實時監測接收消息隊列裏面是否有數據,如果有數據,那麼取出該數據,並寫入用户信息文件裏面,寫入成功後,發送一個 UDP 消息到發送消息隊列裏面,UDP 消息包括某個客户端的 IP,端口以及確認消息。其定義為: struct UDPDATA{ unsigned longulIPAddr; unsigned short wPort; stringsData; };
發送消息線程:該線程實時監測發送消息隊列裏面是否有數據,如果有數據那麼取出來進行分析,獲得 IP 和端口,然後通過通信模塊把數據發送出去。
(c) 通信模塊
功能説明:該模塊封裝了 Socket 通信的 API,完成網絡通信功能。
(d) 消息隊列模塊
功能説明:該模塊實現了 Message Queue 的功能,是一個雙向鏈表。目的是為了數據的緩存,防止用户數據丟失的可能性。系統有兩個消息隊列,一個是接收消息隊列,負責保存接收的消息;另外一個是發送消息隊列,負責保存發送的消息。

Extension Manager主要區別

Adobe Bridge CS4是一款功能強大、易於使用的媒體管理器, 它可以讓您輕鬆地管理、瀏覽、定位和查看創作資源。Adobe Creative Suite® 4 軟件的所有六個版本以及大多數 Adobe 的專業創作應用程序中都包含 Bridge, 它提供了對項目文件和全局設置的集中訪問以及 XMP 元數據的標記和搜索能力。我個人認為:簡單的來講他就是個圖片查看器。
Adobe Device Central CS4軟件為手機和消費電子設備簡化了創新、引人注目的內容的製作。通過測試自動化以及跨動態更新的設備配置文件庫模擬移動內容的網絡性能來節省時間。創建移動項目, 從一箇中心位置管理資源、瞄準設備配置文件並導出選項。在播放內容時記錄它, 併發送高品質的影片剪輯, 更輕鬆地向客户傳達構思。與 Adobe Creative Suite® 4 組件智能集成, Adobe Device Central CS4 可以幫助創意專業人士和移動開發人員向無數移動訂户交付引人入勝的體驗。
Adobe Extension Manager CS4使您能夠輕鬆地安裝、管理和刪除功能擴展。