Entry

プログラミングメモ - InternetCanonicalizeUrl の使い方とか

2009年02月24日

うーん……Win API の InternetCanonicalizeUrl をゴニョゴニョいぢってみたんだけれども,こういう使い方でいいんだろうか。

void CCanurlDlg::OnBtnTrans() {
    DWORD nLen = -1;
    TCHAR cDummy;
    UpdateData(TRUE);
    // get length
    BOOL bRet = ::InternetCanonicalizeUrl(m_strBefore, &cDummy, &nLen, 0);
#if 0  // return value test
    if (!bRet) {
        CString str;
        switch (::GetLastError()) {
        case ERROR_BAD_PATHNAME:
            str = _T("Bad Pathname");
            break;
        case ERROR_INSUFFICIENT_BUFFER:
            str = _T("Insufficient Buffer");
            break;
        case ERROR_INTERNET_INVALID_URL:
            str = _T("Invalid URL");
            break;
        case ERROR_INVALID_PARAMETER:
            str = _T("Invalid Parameter");
            break;
        default:
            str = _T("Unknown Error");
            break;
        }
        ::AfxMessageBox(str);
    }
#endif
    if (nLen > 0) {
        try {
            LPTSTR szBuf = new TCHAR[nLen];
            // translate
            bRet = ::InternetCanonicalizeUrl(m_strBefore, szBuf, &nLen, 0);
            if (bRet) {
                m_strAfter = szBuf;
            } else {
            }
            delete[] szBuf;
        } catch (CMemoryException* e) {
            e->Delete();
            ::AfxMessageBox(_T("Memory Exception !"));
        }
        UpdateData(FALSE);
    }
}

一応,サンプルプログラムを置いておきます。無駄に GUI なんですが。実行ファイルありません。VC6 でコンパイルしました。他の処理系でコンパイルできるかは知りません。

InternetCanonicalizeUrl のサンプルプログラムの図

例によって,最初の呼び出しではわざと失敗させて,必要なバイト数を取得しています。大抵の API では,結果を受けるバッファの引数に NULL を指定すればいいんだけれども,この関数の場合,NULL を渡すとパースする前に FALSE が返ってしまうようで,nLen に必要なバイト数が入ってくれません。どうしたもんだろう。

仕方がないので,ダミーで有効なアドレスを持ったバッファを引数に渡したら,nLen に値が入ってきました。なんなんじゃこりゃ。つか,MSDN と説明が違う(よくある話だけど)。変換結果もこれで合ってるのかよく分からない。つか,何のためにこの関数をいぢりはじめたのか忘れちまった。何やるつもりだったんだっけ……。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN