掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ショットカット作成方法は? (ID:50608)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
サンプルソース作っちゃったし,とりあえず載っけておきます。 はじめさんが見つけたサンプルでは例外を利用していますが, 私はローカルクラスという非常にマイナーな機能を利用して後処理を行っています。 ほかにもいろいろと私の趣味に走ったところがありますが……。 #include <iostream> #include <windows.h> #include <objbase.h> #include <shlobj.h> #include <cstdlib> #include <vector> #include <string> #include <cstring> #include <cwchar> // 仕様が古いコンパイラ対策 #if defined(_MSC_VER) && _MSC_VER <= 1200 namespace std { using ::getenv; using ::wcscat; using ::strcat; } #endif // Microsoft C/C++ Compiler用リンカ指令 #if defined(_MSC_VER) #pragma comment(lib, "ole32.lib") #pragma comment(lib, "uuid.lib") #pragma comment(lib, "shell32.lib") #endif // 出力ファイル名を作り出す const std::wstring getOutputFileName (void) { OSVERSIONINFO osi = { sizeof(OSVERSIONINFO) }; GetVersionEx(&osi); if (osi.dwPlatformId == VER_PLATFORM_WIN32_NT) { // NT系の場合:直接UNICODEで作成 wchar_t buffer[MAX_PATH]; GetCurrentDirectoryW(sizeof(buffer) / sizeof(buffer[0]), buffer); std::wcscat(buffer, L"\\ShortCut.lnk"); return std::wstring(buffer); } else { // 95系の場合:一旦MBCSで作成後変換 char buffer[MAX_PATH]; GetCurrentDirectoryA(sizeof(buffer) / sizeof(buffer[0]), buffer); std::strcat(buffer, "\\ShortCut.lnk"); std::vector<wchar_t> wbuf(MultiByteToWideChar(0, 0, buffer, -1, 0, 0)); MultiByteToWideChar(0, 0, buffer, -1, &wbuf[0], wbuf.size()); return std::wstring(&wbuf[0]); } } int main (void) { // 環境変数からコマンドプロセッサを取得 const char * const comspec = std::getenv("ComSpec"); if (comspec == 0) { std::cerr << "環境変数\"ComSpec\"が設定されていません。" << std::endl; return EXIT_FAILURE; } // COMライブラリの初期化 if (FAILED(CoInitialize(NULL))) { std::cerr << "COMライブラリの初期化に失敗しました。" << std::endl; return EXIT_FAILURE; } struct CoUninitializeCaller { ~CoUninitializeCaller (void) { CoUninitialize(); } } CoUninitialize_; // IShellLink interfaceの取得 IShellLink * shell_link; if (FAILED(CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, IID_IShellLink, reinterpret_cast<void **>(&shell_link)))) { std::cerr << "IShellLinkインターフェースの取得に失敗しました。" << std::endl; return EXIT_FAILURE; } struct IShellLinkReleaser { IShellLinkReleaser (IShellLink * & shell_link) : shell_link_(shell_link) {} ~IShellLinkReleaser (void) { shell_link_->Release(); } private: IShellLink * & shell_link_; } IShellLink_(shell_link); // コマンドプロセッサをオブジェクトに関連付ける if (FAILED(shell_link->SetPath(comspec))) { std::cerr << "コマンドプロセッサをオブジェクトに関連付けることに失敗しました。" << std::endl; return EXIT_FAILURE; } // IPersistFile interfaceの取得 IPersistFile * persist_file; if (FAILED(shell_link->QueryInterface(IID_IPersistFile, reinterpret_cast<void **>(&persist_file)))) { std::cerr << "IPersistFileインターフェースの取得に失敗しました。" << std::endl; return EXIT_FAILURE; } struct IPersistFileReleaser { IPersistFileReleaser (IPersistFile * & persist_file) : persist_file_(persist_file) {} ~IPersistFileReleaser (void) { persist_file_->Release(); } private: IPersistFile * & persist_file_; } IPersistFile_(persist_file); // ショートカットの保存 if (FAILED(persist_file->Save(getOutputFileName().c_str(), TRUE))) { std::cerr << "ショートカットの保存に失敗しました。" << std::endl; return EXIT_FAILURE; } std::cout << "ショートカットを作成しました。" << std::endl; // 後片づけは全てデストラクタ任せ。 // IPersistFile_, IShellLink_, CoUninitialize_の順でデストラクタが呼ばれる。 return EXIT_SUCCESS; }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.