LNKファイル(ショートカット)によるターゲットファイルのパスの解析

1934 ワード

ニマの~ネット上で多くの资料を探してすべて问题のコードがあって、各种の転送、间违ったものが伝わってきて、人の子弟を间违えます!!!
自分で書き直して、注釈をつけて、予備を残しておきます.
参照ヘッダ:#include
重要参照クラスIShellLink:
IShellLinkの主な方法:1、GetArguments:パラメータ情報の取得2、GetDescription:記述情報の取得3、GetHotkey:ショートカットキーの取得4、GetIconLocation:ショートカットアイコンの取得5、GetIDList:ショートカットのターゲットオブジェクトを取得するitem identifier list(Windowsハウジング内のファイル、ディレクトリ、プリンタなどの各オブジェクトに一意のitem identifiler listがある)6、GetPath:ショートカットのターゲットファイルまたはディレクトリを取得する全パス7、GetShowCmd:ショートカットを取得する実行方法、例えば通常のウィンドウ、最大化8、GetWorkingDirectory:作業ディレクトリ9、Resolveの取得:ターゲットオブジェクトが削除または移動された場合でも、特定の検索ルールに従ってターゲットオブジェクトを取得しようとします.名前を変更します.
解析処理の流れ:
1、COMインタフェースの初期化
2、IShellLinkオブジェクトの作成
3、IShellLinkオブジェクトからIPersistFileオブジェクトインタフェースを取得する
4、操作IShellLinkオブジェクト
5、IPersistFileオブジェクトインタフェースを解放する
6、IShellLinkオブジェクトの解放
7、COMインタフェースを解放する
//  1:Lnk    ,  2:        

bool GetShellPath(Char *Src,Char *ShellPath)

{

      bool blret=false;

      ::CoInitialize(NULL); //   COM  

      IShellLink *psl = NULL;

      //  COM  ,IShellLink    

      HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER,IID_IShellLink, (LPVOID *)&psl);

      if (SUCCEEDED(hr))

      {

          IPersistFile *ppf ;
          hr=psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);

          if (SUCCEEDED(hr))

         {

             WCHAR wsz[MAX_PATH] ;

             MultiByteToWideChar( CP_ACP, 0, Src, -1, wsz, MAX_PATH ) ;    //     

             hr=ppf->Load(wsz, STGM_READ);    //    

             if (SUCCEEDED(hr))
             {

                     WIN32_FIND_DATA wfd ;

                     psl->GetPath(ShellPath,MAX_PATH, (WIN32_FIND_DATA*)&wfd,SLGP_SHORTPATH);  //      

                     blret=true;

             }

             ppf->Release(); 

         }

         psl->Release();  //    

       }

       ::CoUninitialize();   //  COM  


       return blret;

}