Lotus Notes/Domino 的 C API 編程

來源:互聯網
上載者:User

瞭解使用 Lotus Notes/Domino C API 進行編程的來龍去脈。本文將解釋 C API 工具箱中發現的一些重要特性,並提供一些可以用來滿足您需求的應用樣本。
使用 Lotus C API for Lotus Notes/Domino 常常使人想起一把方便好用的老式瑞士軍刀:一個時髦的小工具箱,包含許多沒有書面文檔的(undocumented)有用組件!本文旨在重點介紹 Lotus C API for Lotus Notes/Domino 的一些功能,協助開發人員重新發現其無限的潛在用途。對 Lotus Notes/Domino 有基本的瞭解並熟悉程式設計語言就足以應付本文的內容。C 程式設計語言的應用知識可以協助您更好地理解我們討論的一些概念。

Lotus C API toolkit 簡介

可以通過訪問 Toolkits & Drivers page 下載 Lotus C API toolkit for Lotus Notes/Domino。本文的目的是想將該工具箱用於 Windows 平台上的 Lotus Notes/Domino 6.5。在將下載的檔案檔案中的這些檔案解壓縮之後,就可以獲得文檔、標頭檔、庫檔案、已編譯的 OBJ 檔案、樣本程式和樣本中使用的資料庫。

文檔中包括一個使用者指導和一個參考指導,它們都是以單獨 Notes 資料庫的形式出現的。您可以從文檔中獲得許多資訊。同時,使用者指導中包含可以使用該工具箱完成哪些任務以及如何完成這些任務的介紹,而參考指導記錄了所有可用功能。請仔細考慮一下這些資料庫中包含的大量資訊,這對為資料庫建立全文(full-text)索引很有用,這樣就可以快速準確地進行尋找。

標頭檔通常可以在 Include 檔案夾中找到。它們包含用於所有可作為該工具箱的一部分的常數、結構、宏、公用函數的定義。您需要根據程式中使用的 API 呼叫在原始碼中包含相應的標頭檔。庫檔案和已編譯的 OBJ 檔案通常可以在不同作業系統的特定檔案夾下的 Lib 檔案夾中找到。因為 LIB 檔案是需要連結到 API 程式的 DLL 匯入庫,所以 OBJ 檔案是使用 NotesMain 進入點的程式或完成外掛程式伺服器任務所需的引導程式對象。(我們將在文章的後面部分再次回顧這些內容。)

樣本檔案夾中提供了一個詳盡的樣本程式列表。notedata 檔案夾通常包含樣本程式中用到的所有資料庫。參考指導中描繪了每個函數或符號值,它們至少可以被一個樣本程式引用,您可以查看該參考指導,以便瞭解如何在實際程式中使用即將檢查的函數。

在明白了我們必須做什麼之後,繼續研究該工具箱的最好辦法就是鑽研一個實際的程式。在下一節中,我們將通過遍曆兩個不同的程式來研究該工具箱。

 

 回頁首
 

建立一個簡單的程式

讓我們從一個簡單的程式開始:一個輸出 Notes 資料目錄的完全路徑的程式。首先,讓程式中所需的 C 庫中包含標頭檔:

#include <stdio.h> #include <string.h>
接下來,添加來自 Lotus C API for Lotus Notes/Domino 的標頭檔:

#include <global.h> #include <osfile.h>
現在,主函數的任務是調用 NotesInitExtended() 函數來初始化 Notes 運行庫。除非使用的是 NotesMain() 函數而不是 main() 函數,否則必須顯式調用 NotesInitExtended() 函數:

int main(int argc, char *argv[]) {  char       DataDir[256];    STATUS   error = NOERROR;         WORD wlength;      if (error = NotesInitExtended (argc, argv))  {    printf("/n Unable to initialize Notes./n");    return (1);  }
 

最後,我們獲得資料目錄並輸出它。OSGetDataDirectory() 是這個程式中使用的主要 Lotus C API 函數。顧名思義,OSGetDataDirectory() 包含資料目錄的完全路徑。NotesTerm() 函數關閉了 Notes 運行庫,以結束函數的運行。只有在使用 NotesInitExtended() 啟動運行庫的時候,我們才必須顯式調用該函數:

wlength = OSGetDataDirectory(DataDir);  if (wlength > 0)   printf("/n The data directory is %s", DataDir);  NotesTerm();  return (0);     }
 

編譯和連結

接下來,我們要編譯和連結剛才編寫的程式。為此,需要確保已正確地建立了使用環境。當然,最重要的要求是安裝 Lotus Notes 和 Lotus C API toolkit for Lotus Notes/Domino 的匹配版本。此外,還需要 Microsoft Visual C++ 開發環境,以及隨該環境一起提供的 Microsoft C/C++ 編譯器和庫。最後,我們需要設定三個環境變數:

PATH 變數值應該包含 Notes 程式目錄和 Microsoft C Compiler 所在的目錄。
INCLUDE 變數應該包含 Lotus C API 安裝所需的 Include 目錄和 Microsoft C Include 目錄。
LIB 變數應該包含 Lotus C API 安裝所需的用於 Windows 32 平台的 Lib 目錄和 Microsoft C Lib 目錄。
 

如果您喜歡動態地安裝環境變數,那麼可以使用批次檔。以下是一個樣本批次檔:

@echo offrem *** Comments:rem *** C:/Lotus/Notes is the program directory for Lotus Notes 6.5;rem *** C:/Program Files/Microsoft Visual Studio/VC98/ is the rem *** directory where Microsoft Visual C++ is installed; and rem *** c:/notesapi is the directory where the Lotus C API for rem *** Lotus Notes/Domino 6.5 is installed.set Path=.;C:/Program Files/Microsoft Visual Studio/VC98/bin;C:/Program Files/Microsoft Visual Studio/VC98/../Common/MSDEV98/bin;C:/Program Files/Microsoft Visual Studio/VC98/../Common/Tools;c:/Lotus/Notesset LIB=C:/Program Files/Microsoft Visual Studio/VC98/lib;C:/Program Files/Microsoft Visual Studio/VC98/Platformsdk/Lib;C:/Program Files/Microsoft Visual Studio/VC98/mfc/lib;C:/notesapi/lib/mswin32Set INCLUDE=.;C:/Program Files/Microsoft Visual Studio/VC98/PlatformSDK/include;C:/Program Files/Microsoft Visual Studio/VC98/include;C:/Program Files/Microsoft Visual Studio/VC98/atl/include;C:/Program Files/Microsoft Visual Studio/VC98/mfc/include;C:/notesapi/include
 

nmake 工具

在運行該批次檔之後,也就準備好了用於編譯和連結程式的環境。nmake 工具是 Microsoft Visual C++ 安裝的一部分,在這裡用起來非常得心應手。為該工具提供一個 MAK 檔案,以便為您“製造”應用程式。MAK 檔案指定可交付使用的產品、它們的從屬性和構建這些可交付使用產品的命令(如果它們不存在或者比它們所從屬的產品還要老的話)。讓我們來調用已經構造好的程式 simple.c。以下是可以用來構建 simple.exe 的 MAK 檔案的一個樣本:

# Comment:# The MAK file for simple.c - a simple Notes API program !include <ntwin32.mak># The name of our program.PROGNAME = simple# Deliverables and dependencies$(PROGNAME).EXE: $(PROGNAME).OBJ$(PROGNAME).OBJ: $(PROGNAME).C# Compile our program.C.OBJ:    $(cc) $(cdebug) $(cflags) $(cpuflags) /DNT $(cvars) $*.c# Link our program           .OBJ.EXE:    $(link) $(linkdebug) $(conflags) -out:$@ $** $(conlibs) /     notes.lib user32.lib
 

為了檢查可與 nmake 工具一起使用的選項,可以使用命令 nmake -help。用來構建輸出資料目錄的 simple.exe 程式的命令如下所示:

nmake /f simple.mak /a
其中 simple.mak 是我們前面建立的 MAK 檔案,/a 選項指出了我們想構建的所有東西:

NotesMain() 函數

可以使用 NotesMain() 函數作為進入點來編寫相同的程式。惟一不同的是,我們不必像在前面的例子中那樣調用 NotesInitExtended() 和 NotesTerm()。以下就是這個函數:

/* Simple program to find the data directory using the Lotus C API for Lotus Notes/Domino Using NotesMain() as the entry point*//* Include header files that we need from the C library */#include <stdio.h>#include <string.h>/* Include header files that we need from the Lotus C API for Lotus Notes/Domino */#include <global.h>#include <osfile.h>/* Functions defined in this file */void APIErrHandler (STATUS);/* The NotesMain() function */STATUS LNPUBLIC NotesMain(int argc, char far *argv[]){ /* Local variables */ char DataDir[256]; /* The data directory for Lotus Notes*/ STATUS error = NOERROR; /* Return type for most Lotus C API functions  for Lotus Notes/Domino - defined in global.h */ WORD wlength; /* Unsigned integer - defined in global.h */ /* Get the full path of the data directory which is returned by the  OSGetDataDirectory() function in the text buffer whose address is  passed in as the argument. The function return value is the length  of the buffer returned. */ wlength = OSGetDataDirectory(DataDir); /* Print the data directory path. */ if (wlength > 0)  printf("/n The data directory is %s", DataDir); return (NOERROR); }
 

如果您認為該函數改變了 MAK 檔案,那麼您是對的。還記得我們前面談過的引導程式對象嗎?在這裡,我們需要使用這個對象。因此,MAK 檔案使引導程式變成以下這樣:

# Comment:# The MAK file for simplever2.c - a simple Notes API program that uses NotesMain()!include <ntwin32.mak># The name of our programPROGNAME = simplever2# Deliverables and dependencies$(PROGNAME).EXE: $(PROGNAME).OBJ$(PROGNAME).OBJ: $(PROGNAME).C# Compile our program.C.OBJ:    $(cc) $(cdebug) $(cflags) $(cpuflags) /DNT $(cvars) $*.c# Link our program (notice the bootstrap object)           .OBJ.EXE:    $(link) $(linkdebug) $(conflags) -out:$@ $** notes0.obj $(conlibs) /        notes.lib user32.lib
 

 

 回頁首
 

一個更複雜的例子

讓我們轉移到稍大一點的一個程式上來,該程式使用了比簡單例子中更多的 Lotus C API。該程式將尋找本地地址簿中的一個名稱,如果該名稱是有效,則返回辦公室電話和地址。這聽起來是不是很有趣?與平時一樣,我們將從程式中需要的 C 庫的標頭檔開始,然後是來自 Lotus C API 的標頭檔:

#include <stdio.h>#include <string.h>#include <global.h>#include <nsfdb.h>#include <nif.h>#include <osmem.h>#include <miscerr.h>#include <osmisc.h>
 

在這個程式中,我們添加了另一個用於錯誤處理的函數。在這裡,要聲明其原型並從 main() 函數開始。當然,在 main() 函數中,是從聲明所需的所有本地變數開始的。要在構建程式時查明每個變數的用途。接下來要初始化 Notes 運行庫:

void APIErrHandler (STATUS);int main(int argc, char *argv[]){    char   *dbname = "names.nsf";       char   *viewname = "($users)";       char   firstname[256] = "";   char   lastname[256] = "";   char   key[256];   DBHANDLE   dbhandle;                    NOTEHANDLE  notehandle;   NOTEID   viewid;                   HCOLLECTION  collhandle;               COLLECTIONPOSITION collpos;                   HANDLE   bufferhandle;                     NOTEID   *nid;                          DWORD   count;                         DWORD   matches;                       DWORD   whichnote = 0;                 STATUS   error = NOERROR;                WORD   flg;                          BOOL   found;                     char   *itemname = "";   char   itemvalue[256];   WORD   itemlen;   if (error = NotesInitExtended (argc, argv))   {     printf("/n Unable to initialize Notes./n");     return (1);   }
 

我們需要用於該程式的命令列,以便尋找 <firstname> <lastname>,因此,要確保包含所期望的大量命令列參數:

   if (argc != 3)   {             printf("The syntax is: lookup <firstname> <lastname>");         NotesTerm();      return (1);   }     else   {      strcpy(firstname, argv[1]);      strcpy(lastname, argv[2]);      strcpy(key, firstname);            strcat(key, " ");      strcat(key, lastname);      printf("/nContact information for %s :", key);      printf("/n--------------------------------------------");   }
 

接下來,需要開啟地址簿,並對它進行處理。NSFDbOpen() 函數如下所示:

   if (error = NSFDbOpen (dbname, &dbhandle))   {      APIErrHandler (error);        NotesTerm();      return (1);   }
 

閱讀($users)設計記錄

在處理資料庫之後,需要使用 NIFOpenCollection() 函數獲得視圖($users)的設計記錄。NIFOpenCollection() 函數根據視圖記錄處理文檔集。如果在這兩個操作中的任何一個操作中出現錯誤,則需要關閉資料庫並退出:

   if (error = NIFFindView (dbhandle, viewname, &viewid))   {      NSFDbClose (dbhandle);      APIErrHandler (error);        NotesTerm();      return (1);   }   if (error = NIFOpenCollection(         dbhandle,               dbhandle,               viewid,                 0,                      NULLHANDLE,             &collhandle,            NULLHANDLE,             NULL,                   NULLHANDLE,             NULLHANDLE))      {      NSFDbClose (dbhandle);      APIErrHandler (error);        NotesTerm();      return (1);   }
 

尋找名稱

現在我們需要尋找想要在集合中查看的名稱。NIFOpenCollection() 根據主要分類鍵來搜尋集合,該鍵是視圖的第一個列。(必須對視圖進行分類。)如果找到該名稱,則將它放在指向接受檢查的 COLLECTIONPOSITION 的指標之前。如果該函數在運行期間出錯,則意味著該名稱不存在,或者出現了其他一些錯誤:

   error = NIFFindByName (           collhandle,                  key,                     FIND_CASE_INSENSITIVE | FIND_FIRST_EQUAL,            &collpos,                    &matches);         if (ERR(error) == ERR_NOT_FOUND)    {      printf ("/nNo such name in the address book./n");      NIFCloseCollection (collhandle);      NSFDbClose (dbhandle);      NotesTerm();      return (0);    }      if (error)   {      NIFCloseCollection (collhandle);      NSFDbClose (dbhandle);      APIErrHandler (error);        NotesTerm();      return (1);   }
 

通過所獲得的 COLLECTIONPOSITION,可以調用 NIFReadEntries() 函數得到我們感興趣文檔的 NoteID。該函數將所需資訊放置在 bufferhandle 中,我們將允許其指標進入。此外,我們將忽略一些上下文中不需要的參數(比如 count 和 flg)。然而,如果期望在緩衝區中返回的資訊在大小上並不是微不足道的,那麼需要在一個迴圈中封閉對 NIFReadEntries() 的調用,並測試 flg 參數的值。如果有太多的資料而無法將它們都放入緩衝區中,那麼要在 flg 參數中設定 SIGNAL_MORE_TO_DO 位。如果在函數返回之後,緩衝區為 NULL,則需要退出:

   if (error = NIFReadEntries(             collhandle,                      &collpos,                        (WORD) (NAVIGATE_CURRENT),                             0L,              NAVIGATE_NEXT,                    matches - whichnote,              READ_MASK_NOTEID,                 &bufferhandle,                   NULL,                            NULL,                            &count,                     &flg))          {         NIFCloseCollection (collhandle);         NSFDbClose (dbhandle);         APIErrHandler (error);           NotesTerm();         return (1);   }   if (bufferhandle == NULLHANDLE)   {         NIFCloseCollection (collhandle);         NSFDbClose (dbhandle);         printf ("/nEmpty buffer returned by NIFReadEntries./n");         NotesTerm();         return (0);    }
 

既然已經獲得了我們想要獲得的記錄的 NoteID,接下來就可以開啟它。首先,需要使用 OSLockObject() 函數鎖定記憶體中的緩衝區並獲得其地址。我可以將 NoteID 強制轉換為 NOTEID:

   nid = (NOTEID *) OSLockObject (bufferhandle);      if (error = NSFNoteOpenExt(             dbhandle,                      nid[0],                        0,                     &notehandle))          {         OSUnlockObject (bufferhandle);               OSMemFree (bufferhandle);         NIFCloseCollection (collhandle);         NSFDbClose (dbhandle);         APIErrHandler (error);           NotesTerm();         return (1);   }
 

差不多完成了!現在,我們所需要做的一切就是檢查地址和電話號碼是否存在,如果存在,則輸出它們。可以用 NSFItemIsPresent() 檢查這些項是否存在,並用 NSFItemGetText() 獲得這些項的值:

   found = FALSE;    itemname = "MailAddress";   found = NSFItemIsPresent (notehandle, itemname,                                  (WORD)strlen (itemname));   if (found)   {      itemlen = NSFItemGetText (                             notehandle,                             itemname,                            itemvalue,                            sizeof (itemvalue));      printf("/nMail Address: %s", itemvalue);  }  else  {      printf("/nNo Mail Address found");  }  found = FALSE;   itemname = "OfficePhoneNumber";  found = NSFItemIsPresent (notehandle, itemname,                                  (WORD)strlen (itemname));  if (found)  {      itemlen = NSFItemGetText (                             notehandle,                             itemname,                            itemvalue,                            sizeof (itemvalue));      printf("/nOffice Phone Number: %s", itemvalue);  }  else  {      printf("/nNo Office Phone Number found");  }
 

通過解除緩衝區的鎖定並釋放其記憶體,然後關閉記錄、集合和資料庫,來結束函數的運行:

  OSUnlockObject (bufferhandle);  OSMemFree (bufferhandle);  if (error = NSFNoteClose (notehandle))  {      NIFCloseCollection(collhandle);      NSFDbClose (dbhandle);      APIErrHandler (error);        NotesTerm();      return (1);  }      if (error = NIFCloseCollection(collhandle))  {      NSFDbClose (dbhandle);      APIErrHandler (error);        NotesTerm();      return (1);  }  if (error = NSFDbClose (dbhandle))  {           APIErrHandler (error);        NotesTerm();      return (1);  }  NotesTerm();  return (0); }
 

最後一道難題是 APIErrHandler() 函數。該函數獲得與傳遞的錯誤有關的字串,並輸出這些字串。

void APIErrHandler (STATUS error){    STATUS  errorid = ERR(error);    char    errorstring[200];    WORD    len;    len = OSLoadString (NULLHANDLE,                             errorid,                             errorstring,                             sizeof(errorstring));        printf ("Encountered this error : %s", errorstring);}
 

您可能已經注意到以 Lotus C API 函數命名的模式。所有名稱以 NSF 開頭的函數都必須使用資料庫、記錄或項。而那些名稱以 NIF 開頭的函數通常用來處理視圖和集合。處理作業系統級資訊(比如說記憶體中的鎖定對象)的函數名是以 OS 開頭的。在尋找與想歸檔的資訊匹配的函數時,這種命名規範非常有用。

可以從 Sandbox 下載這一節中描述的完整程式。

有用的 Lotus C API 選項

Lotus C API 在用戶端和伺服器端的一些上下文中都很有用。在這一節中,我們將重點介紹一些可用的選項。

設計項目

通過使用 Lotus C API,就有可能建立並操縱諸如代理、表單、視圖和導航器之類的設計項目。在建立設計項目時,NOTE_CLASS_xxx 值很重要,因為它會識別我們將建立的記錄的類型。NOTE_CLASS_DOCUMENT 用於文檔,NOTE_CLASS_FORM 用於表單,NOTE_CLASS_VIEW 用於視圖,NOTE_CLASS_FILTER 用於代理和宏,等等。例如,您可以使用以下函數調用來建立一個視圖設計記錄:

WORD ClassView = NOTE_CLASS_VIEW; NSFNoteCreate(hDB, &hNote); NSFNoteSetInfo(hNote, _NOTE_CLASS, &ClassView);
您甚至可以使用 NSFFormulaCompile() 和 NSFComputeEvaluate() 函數編譯和評估公式。

伺服器外掛程式任務

可以建立一個在伺服器上啟動並執行伺服器任務,就像建立其他任務那樣。儘管可以讓外掛程式任務(add-in task)執行某一項操作並退出,但外掛程式任務通常用於需要定期執行的操作。Lotus C API 提供了一些用來構建外掛程式任務的特定函數。該程式的主要進入點是 AddInMain() 函數。函數 AddInIdle() 用於控製程序中的主迴圈。

AddInDayHasElapsed()、AddInMinutesHaveElapsed() 和 AddInSecondsHaveElapsed() 可以協助使用者判斷是否是時候執行週期性操作。可以使用負載 <taskname> 手工從服務控制台啟動和停止外掛程式任務,並告訴 <taskname> 退出該命令。通過在伺服器的 Notes.ini 檔案上的 ServerTasks 變數值中包含程式名,還可以將外掛程式任務設定為隨伺服器的開啟而自動開始,隨伺服器的關閉而關閉。

定製 Actions 菜單程式

您可以將自己的操作添加到 Notes 客戶機的菜單選項 Actions 中。為了做到這一點,進入點必須是一個具有以下格式的函數:

NAMRESULT LNCALLBACK FunctionName (WORD wMsg, LONG lParam)
該函數可以擁有任何名稱,但必須在模組定義(DEF)檔案的 EXPORTS 函數中用序數值 1 來聲明它。第一個參數指出將執行的操作,第二個參數是特定於操作的資訊。這項操作可以擁有以下這些值:

NAMM_INITNAMM_INITMENUNAMM_COMMANDNAMM_TERM
 

NAMM_INIT 指出現在可以添加一個 Action 功能表項目。NAMM_INITMENU 允許程式修改功能表項目,比如說允許使用或禁用的那些功能表項目。NAMM_COMMAND 指出 Action 功能表項目已經選定,而且現在您可以執行相關的操作。NAMM_TERM 提供了一個執行結束操作(比如釋放記憶體)的機會。

日曆和調度

Lotus C API 提供了執行日曆和調度操作的能力,比如說建立日曆條目或尋找業務繁忙時段。建立日曆條目(比如會議、約會、備忘錄和全天的事件)涉及到使用 NSFNoteCreate() 函數在所需的郵件資料庫中建立一條記錄,並將所需的日曆項添加到該記錄中。

可以使用 SchRetrieve() 函數來檢索某一使用者特定時間的時間表。在檢索時間表時,可以使用 SchContainer_GetFirstSchedule() 函數來獲得第一個時間表對象。然後使用 Schedule_ExtractFreeTimeRange() 函數檢索時間表物件範圍內的空閑時間,或者使用 Schedule_ExtractBusyTimeRange() 函數獲得時間表物件範圍內的繁忙時間。

 

 回頁首
 

擴充能力:Extension Manager

以下是 Lotus C API 提供的值得特別關注的一項服務:Extension Manager。它允許您在通過註冊回調常式來執行某些 Notes 或 Domino 操作之前或之後運行定製進程。該程式的進入點應該是具有以下格式的一個函數:

STATUS LNPUBLIC FunctionName(void)
該函數可以擁有任何名稱,但必須在模組定義(DEF)檔案的 EXPORTS 函數中用序數值 1 來聲明它。回呼函數必須具有以下格式:

STATUS LNPUBLIC FunctionName(EMRECORD FAR * pExRecord);
在註冊回調常式之前,使用 EMCreateRecursionID() 函數獲得一個遞迴 ID 很有用。如果已經調用擴充,那麼這樣做可以防止相同的擴充再次被調用,所以我們推薦您這樣做。EMRegister() 函數用於註冊回調常式。這可以用一個例子來很好地說明:

EMRegister (             EM_NSFDBCLOSE,             EM_REG_BEFORE,             (EMHANDLER)gHandlerProc,             gRecursionID,             &hHandler);
 

第一個參數是 EM_NSFDBCLOSE,它將識別我們想註冊回調的操作。第二個參數是 EM_REG_BEFORE,它指出我們想在叫用作業之前運行該程式。因此,只要調用 NSFDBClose() 操作,就會調用該程式,NSFDBClose() 操作用於關閉資料庫。有許多可以為其註冊回調常式的操作,這個參數值指出了每個以 EM_ 開頭的操作(完整列表可以從 API 參考指導中獲得)。第三個參數是想要調用的定製函數。第四個參數是遞迴 ID(如果有的話),最後一個參數是由取消註冊時需要使用的函數返回的控制代碼。

在結束該程式時,要使用 EMDeregister() 函數取消對回調常式的註冊。要指定構建到 Lotus Notes/Domino 的擴充,則需要使用伺服器或客戶機的 Notes.ini 檔案中的 EXTMGR_ADDINS 變數(這取決於運行該擴充的位置)。

Calendar 設定檔的陷阱

我們的範例程式碼之一展示了如何通過使用結束特定郵件檔案的日曆設定檔更新的常式來使用 Extension Manager。該程式為 NSFNoteUpdateExtended() 註冊了一個回調常式。在這個回調常式中,我們將查看即將更新的記錄是否是我們感興趣的郵件檔案,以及該記錄是否是一個日曆設定檔。如果是,則將日期和時間記錄到一個記錄檔中。在編譯並連結該程式之後,需要使用以下格式在伺服器的 Notes.ini 檔案中列出它:

EXTMGR_ADDINS=<dllname>
可以從 Sandbox 中下載該程式的完整代碼(包括 MAK 檔案和模組定義檔案)。

 
 
 
  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.