C/C++分類文章 顯示方式:簡文 | 列表

2009年04月15日

Openchange/libmapi API 用例

在 libmapi 中,主要的封包結構是 mapi_object_t。使用 mapi_object_init() 建構內容。 主要的函數回傳值是 enum MAPISTATUS,並以 MAPI_E_SUCCESS 表示成功執行。 通常在呼叫 libmapi API 後使用 if (retval != MAPI_E_SUCCESS) return false; 判斷程式流程。

就設計架構而言, libmapi 運作時會管理記憶體資源。使用 MAPIFreeBuffer(), mapi_object_release() 便可釋放閒置的記憶體空間。 但就我實測結果顯示,它目前存有 memory lack 問題。以擷取連絡人清單為例,在擁有 256MB 實際記憶體與 384MB Swap 空間的 GNU/Linux 系統上, 大約在擷取200筆訊息後,就會因為記憶體不足而被系統中止程序。

openchangeclient -p rock --fetch-items=contact

這是目前使用 libmapi 開發大型客戶軟體時必須注意之處。其他Bug可以參考 Openchange開發工具補遺

...繼續閱讀

Posted by shirock at 樂多Roodo!13:09回應(0)引用(0)
標籤:Exchange,MAPI,Openchange

2009年04月12日

Openchange 開發工具補遺

日前有一項工作,需要從 Microsoft Exchange Server 中轉出行事曆、連絡人等等資料。我嘗試使用 Openchage 這套工具來處理。它透過 Exchange 預設的 SMB 封包協定交換資訊。應用軟體開發人員可使用其 libmapi 函數庫設計一般用戶程式。

OpenChange aims to provide a portable Open Source implementation of Microsoft Exchange Server and Exchange protocols.
Openchange

不過 Openchange 仍未臻成熟,在使用前必須修正不少地方。本文說明 header 檔路徑修正、常數定義修正與中日韓語系修正的內容。

...繼續閱讀

Posted by shirock at 樂多Roodo!14:07回應(0)引用(0)
標籤:Exchange,MAPI,Openchange

2007年08月25日

bbslib::pool - 以小換大的設計啟學

bbslib::pool 是一個簡單的記憶體配置功能 (源碼: bbslib-20010331.tar.gz/strexp/pool.c)。乍看之下,像是一個動態長度字串,但實際上,卻是簡單的動態記憶體管理模組。bbslib::pool 當初在設計時,是有多種考量的,例如安全性。當它要複製或銜接一個字串時,如果原先的空間不足,就會自動重配置夠大的空間去儲存,如此可避免 buffer ovewflow 的問題。而在使用效率上, bbslib::pool 是用 page 為單位向系統要求配置記憶體空間。

...繼續閱讀

Posted by shirock at 樂多Roodo!17:51回應(3)引用(0)

2007年08月6日

在 C 程式中使用 MD5 library 及其應用

Tags: C md5 bbslib

簡單地說, MD5 是一種單向雜湊(hashing)演算法,可將你所給予的任何長度字串,藉由 MD5 雜湊演算得出一個長度為 128 位元 (術語稱之為 "digest code")的計算結果。後述以鍵值稱呼 digest code。MD5 演算法,是由 RSA Data Security, Inc 公司所提出的。演算原理參閱 MD5 - Wikipedia

...繼續閱讀

Posted by shirock at 樂多Roodo!18:17回應(10)引用(0)

2007年08月5日

在 C 程式中,使用 Regex (Regular Expression) library

Tags: C Regex bbslib

我以前維護學校的 Firebird BBS 系統時,寫了一套 library ,其中字串處理部份包含了 Regex library 的使用函數。源碼可於此下載: bbslib2 sources tarball。接下來的 Regex library 說明內容,都取自其中的源碼,不另行列出。

Regex 於其他程式語言中之應用現狀,可見《Regular Expression (RegExp) in JavaScript》、《PHP Manual:Regular Expression Functions (POSIX Extended)》等。

...繼續閱讀

Posted by shirock at 樂多Roodo!16:59回應(0)引用(0)

2007年07月18日

STL Vector/Map 的使用練習, 附 Ruby 對照程式碼

Tags: C++ STL

最近在練習使用 C++ STL 中的 Container 功能。嗯,寫著寫著,覺得很不順手啊。例如不能用 Vector/Set/Map 直接建表。Stack 的 pop() 方法沒有回傳值;我用 C 寫的 stack 功能, pop() 是會推一個值出來的。

挑了兩個 STL Container 的練習程式碼,再用 Ruby 寫一段相同的。兩相比較,也算在吐槽吧。

...繼續閱讀

Posted by shirock at 樂多Roodo!16:11回應(13)引用(0)

2007年07月11日

舊程式碼中的 void* 轉型

Tags: C++ void cast 函數指標

前一陣子,為了說明《程式語言中的介面》,我把大約八、九年前寫的 C 語言程式碼翻了出來。編譯的時候出現錯誤訊息,顯示我用了不被允許的轉型動作,即 (void*)。雖然心裡嘀咕了一下,不過還是很快地改成完整的轉型語法 (也更冗長),將之用於文章範例。

這幾天抽空檢視了一下那些舊程式碼,才發現不是程式碼的問題,而是我用錯編譯器了。我的編輯器 PSPad 設定 C/C++ 文件呼叫的編譯器是 g++ (C++ compiler) ,而不是 gcc (C compiler)。而 C++ 不允許將 void* 轉型為其他型態指標。這點與 C 不同。我又測了一下舊有程式碼的 C/C++ 規範相容性。

...繼續閱讀

Posted by shirock at 樂多Roodo!18:08回應(0)引用(0)

C++ Template 筆記

Tags: C++ template metaprogramming

C++ 的 Template 是種將資料型態參數化的功能。將資料型態資訊自程式碼中抽離,代之以簡化的符號 (T, T1, T2, ...)。再由編譯器透過類似巨集代換的方式,根據樣板內容產生實際的程式碼。

  • Function Template (函數樣板)
  • Class Template (類別樣板)。含部份特殊化。
...繼續閱讀

Posted by shirock at 樂多Roodo!16:35回應(0)引用(0)

2007年06月30日

程式語言中的介面,在個體之間協議互動行為的多種形式

Tags: interface class method 動態語言

racklin 說: 我的重點還是只放在 "關注類別是否有實作方法" 也就是 "介面" 的這個概念, 因為原文是討論這個議題. 嗯,我大概是跳太快了。我清楚 interface 是什麼。所以我的回應是在說明「個體之間如何協議互動行為」亦即「軟體合約」的形式。

以C/C++為例,在早期,程序員學了 C++ 可是還是要寫 C 程式的時代,我們會自己用 C 語言實作類別繼承、動態連結等觀念。但我們用的是 C compiler 而非 C++ compiler ,所以很多事我們必須自己處理。其中一點就是個體行為的協議。方法一、在函數文件上說明傳入的個體需擁有哪些行為,我在函數中會檢查此個體是否擁有此行為(函數指標是否為給定了)。方法二、限定一個 struct (只有純函數指標宣告),呼叫者要自己填一張函數指標表傳入,這其實就是 interface 的概念。

...繼續閱讀

Posted by shirock at 樂多Roodo!12:00回應(0)引用(2)

2007年06月25日

Metaprogramming - To Use C/C++ with Dynamic Languages is Easier Than Pure C++

Tags: metaprogramming template c++

日前在回應 jaceju 《PHP為什麼快》一文時,我提到PHP 之所以快,確實跟它骨子裡包的是 C 語言函數有關。Python, Ruby 也是。在某種程度上,這造成了C++的衰退。因為用C語言寫函數庫給 PHP/Python/Ruby使用,還比寫一個C++ template class 簡單。

...繼續閱讀

Posted by shirock at 樂多Roodo!17:39回應(3)引用(0)
 [1]  [2]  [3]  [最終頁]