Q: GetDataBrowserUserState を使って、DataBrowser コントロールのユーザの状態をディスクに書き出せるようにしています。(ユーザの状態とは、カラムの幅や順序など、コントロール内でユーザがカスタマイズできる設定についての情報のことです)。GetDataBrowserUserState によって返された CFDataRef に対して CFDataGetLength を呼び出そうととしましたが、Mac OS X では "EXC_BAD_ACCESS" でクラッシュしてしまいました。何が間違っているのでしょうか? A: 残念ながら、GetDataBrowserUserState のプロトタイプが(Mac OS X 10.2.x およびそれ以前では)正しくないため、 GetDataBrowserUserState は CFDataRef を返さず、CFDictionaryRef を返します。
CFPropertyListyCreateXMLData を使って CFDictionaryRef を CFDataRef に変換できるので、結果に対して CFDataGetLength を呼び出せます。
以下に例を示します。
|
リスト 1.
|
CFDataRef state = NULL;
OSStatus err;
ControlRef browser = GetDataBrowserFromWindow(window);
err = GetDataBrowserUserState(browser, &state);
// 状態の CFType が本当に CFDictionaryRef かどうかを確認
if ((noErr == err) && (CFGetTypeID(state) == CFDictionaryGetTypeID()))
{
CFDataRef temp = NULL;
CFIndex index;
if (state != NULL) // 予防措置的な CoreFoundation エラーチェック
{
temp = CFPropertyListCreateXMLData(NULL, (CFPropertyListRef)state);
if (temp != NULL) // 予防措置的な CoreFoundation エラーチェック
{
index = CFDataGetLength(temp); // バイト単位による長さ
CFRelease(temp); // 作成したら、解放する必要がある
}
}
}
// HIToolbox の規則では、名前に "Copy" か "Create" の付く
// API で取得した参照を解放するが、DataBrowser API はこの規則の導入前に作成されている。
// GetDataBrowserUserState によって返される項目は、
// 解放する必要がある
CFRelease(state);
|
[2003 年 7 月 22 日]
|