見出し画像

[C API Toolkit] trackerサンプルをデバッグしてみた

はじめに

 HCL C API Toolkit for Notes/Domino 12.0のsamples/admin/trackerディレクトリのサンプルを64ビット化しようと試みていたところ、ソースコードに問題を発見しました。

どこが問題?

 TrackerDbStampNotes関数の5番目のパラメータが、tracker.hではHANDLE、tracker.cではDHANDLEと書いてあり、なぜか異なります。
 きっかけは32ビットのtrackerを64ビットにしようと試行錯誤したときのことです...。32ビットでビルドしたときは、HANDLEとDHANDLEは結果的に同じ型のようで警告がでませんでした。64ビットでビルドを試行したところ、HANDLEとDHANDLEが異なる型のようで警告がでました。ヘルプをみると、ノーツ/ドミノ8.0以降はHANDLEのかわりにDHANDLEが使われるようです。

STATUS LNPUBLIC TrackerDbStampNotes(DBHOOKVEC*, char*,
LIST*, DBHANDLE, HANDLE, char*, WORD, void*, WORD);

C API Toolkit\samples\admin\tracker\tracker.h

STATUS LNPUBLIC TrackerDbStampNotes (DBHOOKVEC *pDBHooks,
char *UserName, LIST *GroupList,
DBHANDLE hDB, DHANDLE hIDTable,
char *ItemName, WORD ItemNameLength,
void *Data, WORD Length)

C API Toolkit\samples\admin\tracker\tracker.c

なにが正解?

 正しいのはHANDLEなのかDHANDLEなのか確認するためにソースコードを追ってみます。該当の値はIDEntries関数に渡されていることがわかりました。

sprintf(szLine,
"Service Request Log: user '%s' set field '%s' to '%s' in %ld documents.",
UserName, szItemName, szItemText, IDEntries(hIDTable));

C API Toolkit\samples\admin\tracker\tracker.c

 IDEntries関数とは何でしょうか。調べたところidtable.hに定義がありました。DHANDLEを受け取ると書かれていますので、正解はDHANDLEですね。

DWORD LNPUBLIC IDEntries (DHANDLE hTable);

C API Toolkit\include\idtable.h

 なるほど、つまりtracker.hのTrackerDbStampNotes関数の5番目のパラメータの型をDHANDLEへ修正すればよさそうですね。

STATUS LNPUBLIC TrackerDbStampNotes(DBHOOKVEC*, char*, LIST*, DBHANDLE, DHANDLE, char*, WORD, void*, WORD);

(修正か所)C API Toolkit\samples\admin\tracker\tracker.h

おわりに

 最初にとりかかるサンプルコードがすんなり動かないと、挫折して放り投げたくなります。私はC API Toolkitのためにあれこれして時間を費やしてしまいました。もう少し何とかなると嬉しいです。

サポートいただければ、記事をもっと充実することができます