トップページをblogに変更

トップページをblogに変更してみました。Wikiより日々の記録を書いていくのは便利かな?

SnowLeopardのファイアウォールのダイアログ

SnowLeopardのファイアウォールを有効にしていると、アプリがネットワークに接続するときに「許可するかどうか」を確認するダイアログが表示されます。

最初の一回許可すれば、それ以降は自動で許可されてGUIは表示されないはずなのですが、なぜか毎回表示されます。手元の環境だとWindowsLiveSyncが接続しようとするタイミングで必ず表示されて困っています(許可すればいいけどわずらわしい…)。

海外のフォーラムをみるとWindowsLiveSyncに限らずほかのアプリケーションでも表示されているので解決策がなさそうです。

なるべく早く解消してほしいのですがずっとスルー状態です。iPad関連で忙しすぎるのでしょうか。

Mac miniがディスプレイを検出しない問題

Mac miniをアナログデュアルディスプレイというマニアックな環境で使っているのですが、最近毎回二枚目のディスプレイがディスプレイの検出に失敗するようになり困っていました。起動するごとに、ディスプレイプロパティが表示されず異様に濃い色で表示されるのです。いろいろやってもだめで毎回手で検出しなおしていたのですが、ためしに「ディスプレイの補正」を行ってみたところ検出に成功するようになりました。

はっきりしないので怖いのですがこういうこともあるということで。

Core Data で NSRangeException

古いモデルがシミュレータに残っていたのが原因?アイコン長押しでアプリを削除してやりなおしたら大丈夫になりました。

CWinApp::m_pszProfileNameはdeleteじゃなくfreeする

MFCアプリでiniファイルの書き出しがうまくいかない現象に悩んでいました。その現象自体はiniファイルのパスをフルパスで指定することで解決したのですが(Vista以降で起こるUACがらみの挙動が影響しているらしい)、今度はプログラム終了時にヒープが壊れて文句をいわれるようになってしまいました。

MFCアプリでiniファイルのパスを指定するのはCWinAppのm_pszProfileNameに値を設定します。ここでm_pszProfileNameに直接文字列リテラルのポインタを代入していたのがだめな原因でした。C++とすっかりご無沙汰だったせいで結構初歩的なところでボロボロです。悔しいですw

■間違い

m_pszProfileName = _T("d:\\temp\\test.ini");

■正解

if (m_pszProfileName) {
    free((void*)m_pszProfileName);
}
m_pszProfileName = _tcsdup(_T("d:\\temp\\test.ini"));

IUniformResourceLocatorを使ってインターネットショートカット作成

IUniformResourceLocatorを使ってインターネットショートカット(*.url)を作成するありがちなコードがWindows 7 64bit版だと動きませんでした(ファイル自体は作られるが中にURLが入らない)。

    if (!SUCCEEDED(CoInitialize(NULL)))
        return FALSE;

    // IUniformResourceLocator オブジェクトを作成しポインタを取得する
    IUniformResourceLocator *pURL = NULL;
    HRESULT hResult = CoCreateInstance (CLSID_InternetShortcut, NULL,
                CLSCTX_INPROC_SERVER, IID_IUniformResourceLocator, (LPVOID*)&pURL);

    BOOL bResult = TRUE;
    if (SUCCEEDED(hResult)) {
        IPersistFile *ppf = NULL;
        // ショートカットを二次記憶装置に保存するため IPersistFile
        // インターフェイスの問い合わせをおこなう
        hResult = pURL->QueryInterface(IID_IPersistFile, (void **)&ppf);
        
        if (SUCCEEDED(hResult)) {
            // URLを設定する
            pURL->SetURL(csURL, 0);
#ifdef _UNICODE
			ppf->Save(csFile, TRUE);
#else
            WCHAR wsz [MAX_PATH];       // Unicode 文字列へのバッファ
            // 文字列がANSI文字で構成されるようにする
            MultiByteToWideChar(CP_ACP, 0, csFile, -1, wsz, MAX_PATH);
            // ショートカットを保存する
            ppf->Save(wsz, TRUE);
#endif
            // IPersistFile へのポインタを開放する
            ppf->Release();
        } else {
            bResult = FALSE;
        }
        // IUniformResourceLocator へのポインタを開放する
        pURL->Release();
    } else {
        bResult = FALSE;
    }
    CoUninitialize();
    return bResult;

結局、Save()に渡すパスが相対パスだとだめで絶対パスだと大丈夫みたいなんですが、いつの間にかこういう仕様になったのでしょうか。謎は深まる…。

iPhone SDKの入れ替え

iPhone SDK 3.2.1から3.2.2に入れ替え。3.2.1をアンインストールしてから3.2.2を入れた。

アンインストールはターミナルで以下のコマンドを実行する。

$ sudo /Developer/Library/uninstall-devtools --mode=all

インストールはdmgファイルをマウントしてインストールスクリプトを実行するだけ。

うちのMac環境はSnow Leopardオンリーだから関係ないけど、Leopard用のiPhone SDKがダウンロードできなくなっていた。古い環境もダウンロードできればいいのに。

■入れ替えた後に「内部エラー」が発生する場合
error

XCode.plistを削除する。

$ rm ~/Library/Preferences/com.apple.XCode.plist

Windows7 64bit + Visual Studio 2008でFaEditビルドできずの続き

「コンピュータにmfc90d.dllがないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。」というエラーが表示されビルドに失敗していた問題ですが、結論からいうと、Visual Studio 2008 Professionalを再インストールし解決しました。

なんかわからんが珍しくエラーメッセージが真実を伝えていたようです。やるなMicrosoftw。なぜmfc90d.dllがなくなっていたのかという根本的な問題は解決しないままなのですがとりあえず良しと。海外のフォーラムで「Visual Studio 2008で一からプロジェクトを作り直して解決」という途方もない解決策(?)が提示されていましたがそれ解決策かとw。

iPhone Core Dataについて

SQLを書くのは苦にならないのですがいいかげんSQLite3を直で使うのはよくないと改心し、Core Dataに関して調べてみました。

日本語ドキュメントっていまいち探せません。Google検索からしかリンクが見つからなかったのでどこから入ればいいのかしばらくうろついてしまいました。

Windows7 64bit + Visual Studio 2008でFaEditビルドできず

そろそろWindows7対応をしないといけないと思いWindows 7 64bit版でFaEditをビルドしてみたのですが、「コンピュータにmfc90dがないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。」とエラーが表示され起動できず…orz。それにしても「プログラムを再インストールしてみてください」っていう適当なエラーメッセージ、Visual Studio 2008を再インストールしろってことなんでしょうか?

ためしにVistaマシンでビルドしてみたら起動できたので、Windows 7 64bit版とVisual Studio 2008との間で何か問題があるのかもしれません。VC+MFCの世界からすっかり遠ざかっていたんで解決するのに時間がかかりそうです。困った。