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()に渡すパスが相対パスだとだめで絶対パスだと大丈夫みたいなんですが、いつの間にかこういう仕様になったのでしょうか。謎は深まる…。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする