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