はじめまして。
ショットカットはどのようにすれば作成できるのでしょうか?
IShellLinkを使って作るようです……。
詳しくは知らないので,とりあえず本に載っていたことをちょこっと。
1.) IShellLinkのインターフェースを取得する(CoCreateInstance)。
2.) ショートカットに関する設定を行う。
3.) IPersistFileインターフェースを取得する(IUnknown::QueryInterface)。
4.) IPersistFile::Saveメソッドでショートカットを保存する。
5.) IUnknown::Releaseでインターフェースを解放する。
という順序らしいです。
出典
「Win32プログラミングテクニック(Visual C++ 5.0対応)」油谷実紀・平見知久著
秀和システム ISBN4-87966-752-8 初版第1刷(1997/11/10)
ありがとうございます。
ちょうど私の方でもサンプル見つけました。
http://www.runan.net/program/tips/sdk_03_CreateShortCut.shtml
サンプルソース作っちゃったし,とりあえず載っけておきます。
はじめさんが見つけたサンプルでは例外を利用していますが,
私はローカルクラスという非常にマイナーな機能を利用して後処理を行っています。
ほかにもいろいろと私の趣味に走ったところがありますが……。
#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;
}
ツイート | ![]() |