何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 36167
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

予想外のフィードバックに、コードを引用し直すことにする。

ショートカットを作成するには(暁の傭兵 ソフトはうす)より:


BOOL CreateShortCut(LPCTSTR lpShortCutPath, LPCTSTR lpTargetFile)
{
    HRESULT hr;             //いろいろな戻り値を入れる
    IShellLink *pShellLink = NULL;
    IPersistFile *pPersistFile = NULL;
    OLECHAR SCPath[500];    //保存先のパスはUnicode

#ifndef UNICODE
    // ANSI環境なら保存先パスをUnicodeに変換
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpShortCutPath, -1,
                            SCPath, MAX_PATH );
#endif

    try{
        // [2] OLE初期化
        CoInitialize(NULL);

        // [3] IShellLinkインターフェイスの作成
        hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                IID_IShellLink, (void**)&pShellLink);
        if (hr != S_OK)
            throw(FALSE);

        // [4] リンク先パスの設定
        pShellLink->SetPath(lpTargetFile);

        // [5] IPersistFileインターフェイスの取得
        if (pShellLink->QueryInterface(IID_IPersistFile, 
                    (void**)&pPersistFile) != S_OK)
            throw(FALSE);

        // [6] ファイルに保存
        if (pPersistFile->Save(SCPath, true) != S_OK)
            throw(FALSE);
        throw(TRUE); // 成功
    }
    catch(BOOL IsOK)
    {
        // [7][8] オブジェクト解放
        if (pPersistFile != NULL)
            pPersistFile->Release();
        if (pShellLink != NULL)
            pShellLink->Release();

        // [9] OLE終了処理
        CoUninitialize();
        if (!IsOK){
            MessageBox(NULL, TEXT("ショートカット作成失敗"), NULL, MB_OK);
        }
        return IsOK;
    }
}

MSDN をつらつら調べたけど、ショートカットを作成するには、この COM オブジェクトを使った方法しか無いように思う。昔やったけど、コードを紛失してしまっているので、どのようにしてやったのかわからない。

言われて思い出したけど、クラス作ってデストラクタで後始末する、でも良いと思う。


class CreateShortcut
{
private:
    IPersistFile* pPersistFile;
    IShellLink* pShellLink;
    OLECHAR* pSourcePath;

public:
    CreateShortcut(LPCTSTR sourcePath) {
        USES_CONVERSION;
        pPersistFile = NULL;
        pShellLink = NULL;
        OLECHAR* src = T2W(const_cast<LPTSTR>(sourcePath));
        pSourcePath = new OLECHAR[wcslen(src) + 1];
        wcscpy(pSourcePath, sourcePath);
    };
    ~CreateShortcut(void) {
        delete[] pSourcePath;
        if (pShellLink != NULL) {
            pShellLink->Release();
        }
        if (pPersistFile != NULL) {
            pPersistFile->Release();
        }
    };
    bool CreateTo(LPCTSTR targetPath)
    {
        USES_CONVERSION;
        HRESULT hr;
        hr = CoCreateInstance(
            CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER
            , IID_IShellLinkW, (LPVOID*) &this->pShellLink);
        if (hr != S_OK) {
            return false;
        }
        this->pShellLink->SetPath(this->pSourcePath);
        hr = this->pShellLink->QueryInterface(
            IID_IPersistFile, (LPVOID*) &this->pPersistFile);
        if (hr != S_OK) {
            return false;
        }
        hr = this->pPersistFile->Save(
            T2W(const_cast<LPTSTR>(targetPath)), TRUE);
        if (hr != S_OK) {
            return false;
        } else {
            return true;
        }
    };
};

こんな感じ?IID_IShellLink が定義されていない、ってエラーがでるので、shobjidl.h を見ると、IID_IShellLinkW と IID_IShellLinkA は定義されているけど、IID_IShellLink は定義されていなかった...こんなモン?

CoInitialize, CoUninitialize は、使う側で行うこと。

一応動くけど、targetPath に指定する拡張子は ".lnk" で無ければならないはず。

投稿日時 : 2007年9月28日 20:25
コメント
  • # re: 「goto使うな主義」の悪その2
    渋木宏明(ひどり)
    Posted @ 2007/09/29 9:06
    >クラス作ってデストラクタで後始末する、

    #import が作ってくれます。

  • # re: 「goto使うな主義」の悪その2
    jetmole
    Posted @ 2009/09/21 21:37
    IID_IShellLinkW ここでみつけた
    あとソース読みやすいです㌧

    gotoはつかいますよ
    jpとかjrも使うし。

    読みやすくてバグが(少)なければいいと思う…。
タイトル
名前
Url
コメント