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