ももらぼっ!にっき


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)

本日のツッコミ(全3件) [ツッコミを入れる]
_ Offisnail (2006年10月24日 10:55)

こんにちは〜EDB解析頑張ってますね〜<br>詳しく見てませんがpimsotore.hの#define PIMR_XXXXとほぼ合致しているように見えます。<br> PIMPR_BODY_BINARYはPIM_PROP_TAG( CEVT_PIM_STREAM,0x001E)と宣言されているので1ワード分(Ox001E)合致する様です

_ Offisnail (2006年10月24日 11:20)

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>未検証ですが、多分こんな感じだと思います

_ ももたろ (2006年10月24日 21:45)

おぉー。<br>どうせヘッダになんて書いてないだろうと決め付けて、そっちの方向からの調査はまったくしてませんでした。<br>このネタでかなり解析が進みそうです!<br><br>この週末にでもやってみます。<br>情報ありがとうございましたm(_ _)m