メモリに関する注意点
malloc (Delphiの場合はGetMem) でヒープ領域からメモリを確保する必要がある場合には、 極力ICmnPilot::cmnAllocを使用してください。
ICmnPilot::cmnAlloc、 ICmnPilot::cmnMakePostData、 ICmnPilot::cmnWebRequest、 ICmnPilot::cmnRegReplace、 ICmnPilot::cmnRegResult、 ICmnPilot::cmnRegSubResult、 ICmnPilot::cmnGetNextURL、 ICmnPilot::cmnGetMesOption、 ICmnPilot::cmnEncodeOptionDataで得た領域は 使用後にICmnPilot::cmnFreeしなければなりません。
これらのメソッドではメモリはCMNにより管理され、 CPX終了時にメモリリークを検出することができます。
メモリリークはCMNのオプション[その他]の「エクステンションをデバッグする」をチェックした時のみ有効となりますので、 CPXをリリースする前に必ずメモリリークがないことを確認してください。
Delphiではメモリの扱いに不慣れな方も多いかと思われますので、 参考として以下にメモリの開放を意識せずにこれらのメソッドを使用する一例を示します。
この例はページを受信し、そのページ領域を String 型で受け取る関数です。
本来ICmnPilot::cmnWebRequestは LPSTR 型のメモリ領域を戻し、 使用後にその領域を開放する必要がありますが、 このラッパー関数ではその領域を String 型にコピーしてその場でメモリ領域を開放してますので、 ソース内でICmnPilot::cmnWebRequestを直接使用する代わりに ラッパー関数である MyWebRequest を使用することにより、 メモリ開放を意識せずに受信ページを String 型として扱うことができるようになります。
Delphi
function MyWebRequest (var WebParam: TWebParam): String; var pPage: LPSTR; stPage: String; begin pPage := m_pICmnPilot.cmnWebRequest(WebParam); stPage := pPage; m_pICmnPilot.cmnFree(pPage); // すぐに開放しちゃう Result := stPage; end;また、CPXはDLLとしてCMNのプロセス内で動作しますので、 CPXが例外を発生するとCMNが落ちることとなります。
メモリのアクセス等には十分に気を付けて実装してください。
巡回中断への対応
巡回中に巡回中断されることがありますので、CPXも巡回中断に対応する必要があります。
巡回中断はICmnPilot::cmnCheckExitで知ることができますので、 巡回中は極力500ミリ秒以内の間隔で巡回中断を確認し、中断されていた場合には速やかに処理を中断してください。
また、巡回処理中に500ミリ秒以上スリープする必要がある場合にはICmnPilot::cmnSleepを使用し、 スリープ中の巡回中断に対応するようにしてください。
StrStrIについて
WindowsAPIのStrStrI(大文字小文字を区別しない文字列検索)はCPU負荷が非常に高い為、 受信ページ内の複数の発言に対する処理をするループ内では原則として使用しないようにしてください。 (ループ外では可。)
大文字小文字を区別せずにHTMLタグを検索する場合にはstrchrで「<」を検索してからmemicmpで文字列比較することにより、 CPU負荷をかなり削減することができます。
例
LPSTR MyCpx::_SearchTAG (LPCSTR lpStr, LPCSTR lpTAG) { int len = strlen (lpTAG); while (*lpStr) { if ((lpStr = strchr (lpStr, '<')) == NULL) return NULL; if (memicmp (lpStr, lpTAG, len) == 0) return (LPSTR) lpStr; lpStr++; } return NULL; }