2006年10月23日 [長年日記]
_ [WM5][W-ZERO3] caltβテストに募集された方で…。
まだ、私からのメールを受け取っていない方はいらっしゃいますか?
こちらからは漏れなく送信させてもらったツモリなのですが、 何かの手違いでメールが届いていなかったらいやだなぁ、と思いまして。 たまーに、infoで始まるメールは全てスパムメール扱いにしていて、 私からのメールを拒否る人がいましてね。 気になったので、一応にっき上で聞いてみました。
もしメールを受け取ってない方がいらっしゃいましたら、お手数ですが再度ご連絡いただければと思います。
以上、業務報告でしたm(_ _)m
あ、募集は引き続き行っておりますよ!
_ [WM5] pim.volのデータベースを直接参照する。
caltでは、pim.volのデータベースを直接参照して予定情報を取得しています。 具体的にはEDBというデータベースエンジン(?)のAPIを使って、以下のようにソースを書いています。
CEGUID guid; CeMountDBVolEx(&guid, _T("pim.vol"), NULL, OPEN_EXISTING);
で、データベースをマウントして、
HANDLE session = CeCreateSession(&guid);
で、セッションを作成して
SORTORDERSPECEX sos; ZeroMemory(&sos, sizeof(SORTORDERSPECEX)); sos.wVersion = SORTORDERSPECEX_VERSION; sos.wNumProps = 1; sos.wKeyFlags = 0; sos.rgPropID[0] = 0x10420040; //開始時間 sos.rgdwFlags[0] = 0;
で、ソートキーを指定して
CEOID ceoid; HANDLE hdb = CeOpenDatabaseInSession(&session, &guid, &ceoid, _T("Appointments Database"), &sos, 0, NULL);
で、データベースを開いて、
CEPROPID prgPropID[] = { 0x10420040, //開始時間 0x0020001f //件名 }; WORD wNum = 2; //取得するプロパティ数 CEPROPVAL *lpPropVal; DWORD cbBuffer = 0; HANDLE hHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 2048, 0); CEOID ceoid = CeReadRecordPropsEx(&hdb, CEDB_ALLOWREALLOC, &wNum, prgPropID, (LPBYTE *)&lpPropVal, &cbBuffer, hHeap);
で、プロパティを取得します。
あ、ヒープの開放やハンドルの開放などなどの後始末はココに書いてませんので、 これをこのまんま使わないでくださいね。 メモリリークしまくってしまいます。 caltで使っている(後始末をちゃんとしている)ソースが見たい人は、websvnにでもアクセスしてみてください。 今の最新ほやほやのソースが見られますので。
で、ここからが本題。
予定データをEDBでアクセスするには、プロパティIDというもの(上記ソース上、0x10420040とか書かれてたヤツ)が必要です。IDそれ自身はCeGetDatabasePropsというAPIで取得できるのですが、それぞれのIDの意味が全然わかりません。 手探りで調べてみて、解析できたのが以下の通り。
0x10000066( 0):ULONG ID(?) 0x200f0012( 1):USHORT 修正回数 0x001e0064( 2):stream 0x0028000b( 3):BOOL アラーム 0x0029001f( 4):文字 0x00460013( 5):ULONG アラームの時間 0x002a0013( 6):ULONG 0x10400013( 7):ULONG 開始時間から終了時間までの差(分) 0x0041001f( 8):文字 場所 0x203f0064( 9):stream 0x0022000b(10):BOOL 繰返し予定 0x10420040(11):日付 開始時間 0x0044000b(12):BOOL 終日予定 0x00450013(13):ULONG 予定の公開方法(0〜3) 0x00210013(14):ULONG 秘密度(0〜3) 0x0020001f(15):文字 件名 0x0061000b(16):BOOL 0x00480041(17):BLOB 0x205f0064(18):stream 0x00500013(19):ULONG 0x0051001f(20):文字 0x00530040(21):日付 0x00470041(22):BLOB 0x00520040(23):日付 作成時間 0x10430040(24):日付 0x001b0013(25):ULONG
まぁ、備忘録ということで解析結果のメモを残しておきます。 続きを解析してやろうとかいう酔狂な方がいれば、手持ちのデータは提供しますですよ。(って上記内容でほぼ打ち止めですけどorz)
こんにちは〜EDB解析頑張ってますね〜<br>詳しく見てませんがpimsotore.hの#define PIMR_XXXXとほぼ合致しているように見えます。<br> PIMPR_BODY_BINARYはPIM_PROP_TAG( CEVT_PIM_STREAM,0x001E)と宣言されているので1ワード分(Ox001E)合致する様です
0x10000066( 0):ULONG PIMPR_OID<br>0x200f0012( 1):USHORT ?修正回数<br>0x001e0064( 2):stream PIMPR_BODY_BINARY<br>0x0028000b( 3):BOOL PIMPR_REMINDER_SET<br>0x0029001f( 4):文字 PIMPR_REMINDER_SOUND_FILE<br>0x00460013( 5):ULONG PIMPR_REMINDER_MINUTES_BEFORE_START<br>0x002a0013( 6):ULONG PIMPR_REMINDER_OPTIONS<br>0x10400013( 7):ULONG PIMPR_DURATION<br>0x0041001f( 8):文字 PIMPR_LOCATION<br>0x203f0064( 9):stream ?<br>0x0022000b(10):BOOL PIMPR_IS_RECURRING<br>0x10420040(11):日付 PIMPR_START<br>0x0044000b(12):BOOL PIMPR_ALL_DAY_EVENT<br>0x00450013(13):ULONG PIMPR_BUSY_STATUS<br>0x00210013(14):ULONG PIMPR_SENSITIVITY<br>0x0020001f(15):文字 PIMPR_SUBJECT<br>0x0061000b(16):BOOL PIMPR_TEAM_TASK<br>0x00480041(17):BLOB PIMPR_TIMEZONE<br>0x205f0064(18):stream ?<br>0x00500013(19):ULONG PIMPR_MEETING_STATUS<br>0x0051001f(20):文字 PIMPR_MEETING_ORGANIZER_NAME<br>0x00530040(21):日付 PIMPR_ATTENDEES_CRITICAL_CHANGE<br>0x00470041(22):BLOB PIMPR_GLOBAL_OBJECT_ID<br>0x00520040(23):日付 PIMPR_MEETING_OWNER_CRITICAL_CHANGE<br>0x10430040(24):日付 PIMPR_END<br>0x001b0013(25):ULONG PIMPR_SOURCE_ID<br><br>未検証ですが、多分こんな感じだと思います
おぉー。<br>どうせヘッダになんて書いてないだろうと決め付けて、そっちの方向からの調査はまったくしてませんでした。<br>このネタでかなり解析が進みそうです!<br><br>この週末にでもやってみます。<br>情報ありがとうございましたm(_ _)m