none
外部シンボル未解決(IID_IPersistFile,IID_IShellLinkW,CLSID_ShellLink) RRS feed

  • 質問

  • あるコードをVisual C++ 2010 Expressでビルドしたところ、以下のLNK2020,LNK2001エラーが発生します。

    1>hogehoge.obj : error LNK2020: 未解決のトークン (0A000018) IID_IPersistFile
    1>hogehoge.obj : error LNK2020: 未解決のトークン (0A00001B) CLSID_ShellLink
    1>hogehoge.obj : error LNK2020: 未解決のトークン (0A00001C) IID_IShellLinkW
    1>hogehoge.obj : error LNK2001: 外部シンボル "IID_IPersistFile" は未解決です。
    1>hogehoge.obj : error LNK2001: 外部シンボル "IID_IShellLinkW" は未解決です。
    1>hogehoge.obj : error LNK2001: 外部シンボル "CLSID_ShellLink" は未解決です。

    ビルドしたコードは以下の通りです。

    ----------

        hRes = ::CoInitialize(NULL);
        if (SUCCEEDED(hRes))
        {
            hRes = ::CoCreateInstance(CLSID_ShellLink,
                                      NULL,
                                      CLSCTX_INPROC_SERVER,
                                      IID_IShellLink,
                                      (LPVOID *)&pisl);
            if (SUCCEEDED(hRes))
            {
                pisl->SetPath((LPCTSTR)szwSrcPath);

                hRes = pisl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf);
                if (SUCCEEDED(hRes))
                {
                    hRes = ppf->Save((LPCTSTR)szwShortcutPath, TRUE);
                    ppf->Release();
                }
                pisl->Release();
            }
            ::CoUninitialize();
        }

    ----------

    stdafx.h内で、

    #pragma comment(lib, "ole32.lib")
    #pragma comment(lib, "shell32.lib")
    #pragma comment(lib, "shlwapi.lib")
    #pragma comment(lib, "uuid.lib")

    はしているのですが、何が悪いのでしょうか?

    ご教授いただけますよう、お願いいたします。

    2014年2月7日 2:48

回答

  • bonito1111さん、こんにちは。

    #include <vcclr.h>がありますね。

    ひょっとして、プロジェクトのプロパティの「共通言語ランタイムサポート」を「純粋MSIL共通言語ランタイムサポート(/clr:pure)」にしていませんか?もしそうなっていたら、「共通言語ランタイムサポート(/clr)」にしてみてください。

    変更方法は、プロジェクトのプロパティから、構成プロパティ→全般→「共通言語ランタイムサポート」です。

    clr/pureですと、ネイティブの実行可能コードが含まれないために、リンクエラーが発生していると思います。

    詳細はこちらをご覧ください。

    • 回答の候補に設定 qt6 2014年2月18日 7:18
    • 回答としてマーク 星 睦美 2014年2月20日 4:07
    2014年2月7日 7:59

すべての返信

  • bonito1111さん、こんにちは。

    #includeを追加して下さい。

    #include <shobjidl.h>
    #include <shlguid.h>

    ショーットカット(ShellLink)の説明が書かれています。

    Using Shell Links

    の部分に#includeの記載例がありますので、ご確認下さい。

    2014年2月7日 6:11
  • にゃにゃおさま

    ご返信ありがとうございました。

    ご指摘のinclude文は以下のようになっておりますが、依然としてリンクエラーが出ている状態です。

    従いましてご指摘いただいたinclude文は記述してあるのですがダメなのです。

    何か分かることがあれはアドバイスいただければ幸いです。

    --- stdafx.h ---

    #pragma once

    #include <Windows.h>
    #include <WinNls.h>
    #include <ShObjIdl.h>
    #include <ObjBase.h>
    #include <ObjIdl.h>
    #include <ShlGuid.h>
    #include <Shlwapi.h>
    #include <ShlObj.h>
    #pragma comment(lib, "ole32.lib")
    #pragma comment(lib, "shell32.lib")
    #pragma comment(lib, "shlwapi.lib")
    #pragma comment(lib, "uuid.lib")
    #include <stdio.h>
    #include <tchar.h>
    #include <stdlib.h>
    #include <string.h>
    #include <direct.h>
    #include <malloc.h>
    #include <ctype.h>
    #include <vcclr.h>
    #include <math.h>

    2014年2月7日 7:37
  • bonito1111さん、こんにちは。

    #include <vcclr.h>がありますね。

    ひょっとして、プロジェクトのプロパティの「共通言語ランタイムサポート」を「純粋MSIL共通言語ランタイムサポート(/clr:pure)」にしていませんか?もしそうなっていたら、「共通言語ランタイムサポート(/clr)」にしてみてください。

    変更方法は、プロジェクトのプロパティから、構成プロパティ→全般→「共通言語ランタイムサポート」です。

    clr/pureですと、ネイティブの実行可能コードが含まれないために、リンクエラーが発生していると思います。

    詳細はこちらをご覧ください。

    • 回答の候補に設定 qt6 2014年2月18日 7:18
    • 回答としてマーク 星 睦美 2014年2月20日 4:07
    2014年2月7日 7:59
  • にゃにゃおさま

    ご指摘の通りプロジェクトのプロパティを変更したところ、エラーは除去され無事ビルドすることができました。

    丁寧で迅速なアドバイスに感謝いたします。

    もう少しいろいろと勉強しないといけないですね。

    ありがとうございました。

    2014年2月7日 11:00