
[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);
STATUS LNPUBLIC TrackerDbStampNotes (DBHOOKVEC *pDBHooks,
char *UserName, LIST *GroupList,
DBHANDLE hDB, DHANDLE hIDTable,
char *ItemName, WORD ItemNameLength,
void *Data, WORD Length)
なにが正解?
正しいのはHANDLEなのかDHANDLEなのか確認するためにソースコードを追ってみます。該当の値はIDEntries関数に渡されていることがわかりました。
sprintf(szLine,
"Service Request Log: user '%s' set field '%s' to '%s' in %ld documents.",
UserName, szItemName, szItemText, IDEntries(hIDTable));
IDEntries関数とは何でしょうか。調べたところidtable.hに定義がありました。DHANDLEを受け取ると書かれていますので、正解はDHANDLEですね。
DWORD LNPUBLIC IDEntries (DHANDLE hTable);
なるほど、つまりtracker.hのTrackerDbStampNotes関数の5番目のパラメータの型をDHANDLEへ修正すればよさそうですね。
STATUS LNPUBLIC TrackerDbStampNotes(DBHOOKVEC*, char*, LIST*, DBHANDLE, DHANDLE, char*, WORD, void*, WORD);
おわりに
最初にとりかかるサンプルコードがすんなり動かないと、挫折して放り投げたくなります。私はC API Toolkitのためにあれこれして時間を費やしてしまいました。もう少し何とかなると嬉しいです。
いいなと思ったら応援しよう!
