最終更新 2003 10/10
サンプルのダウンロード → Exp_CreateShortCut.lzh(39k)
全ソースコード
サンプルがかなり長いので CreateShortCut() 関数と WinMain() の中を中心に
見るだけでよいと思います。
他の部分は フォルダを選択するダイアログの表示とファイルを開く
ダイアログの表示を行っているだけです。これらは別の項で説明しています。
ここで見る必要はないでしょう。
ショートカットを作成する方法をいろいろ調べてみたのですが、COMを
使った方法しか発見できませんでした。
COMの詳しい仕組みは理解する必要はないと思います。
とりあえず、やり方だけ分かればあとはなんとかなります。
必要になったら専門書を読むなりして対応していけば良いと思います。
使い方は DirectX に良く似てますねぇ〜
【 準備 】
最初に shlobj.h をインクルードします。
念のため #pragma comment を使って shell32.lib をリンクするように
設定しています。
【 作業の流れ 】
作業の流れは
1.COM 初期化
2.IShellLinkオブジェクト生成
3.IPersistFileオブジェクトのポインタ取得
4.作成するショートカットのパスをセット
5.作成するショートカットの設定
6.作成するショートカットのパスを Unicode に変換して保存
7.オブジェクトの解放
8.COM 終了
こんな感じです。
1.〜4.までの詳しいやり方はサンプルをご覧下さい。
【 作成するショートカットの設定 】
ここでは5.について少し説明したいと思います。
何かご自分のディスクにあるショートカットのプロパティを
見てもらうと分かると思うのですが、いくつか設定項目があると思います。
中には何に使うのか良く分からない項目もあります。(自分にはあります)
だいたい、どのバージョンのウィンドウズにもある項目は
作業フォルダ
ショートカットキー
実行時の大きさ
コメント
アイコンの変更
でしょうか。
サンプルでは上から順番に
作業フォルダ psl->SetWorkingDirectory( pWorkFolderPath );
ショートカットキー なし
実行時の大きさ psl->SetShowCmd( SW_SHOWNORMAL );
コメント psl->SetDescription( pDescription );
アイコンの変更 psl->SetIconLocation( pTargetPath, 0 );
の部分に対応しています。
●作業フォルダの設定
作業フォルダは、例えばコマンドプロンプトでCのコンパイラを
使う時などに、コンパイラが作ったファイルを保存しておくための
フォルダです。
ショートカットがリンクしている実行ファイルを起動した時に
一時的なファイルを置いておく場所とでも言うのでしょうか・・・。
作業フォルダを指定しない場合、どこが作業フォルダになるかは
実行ファイルによって違うと思います。(多分)
●実行時の大きさの設定
実行時の大きさの SetShowCmd() は ShowWindow() API関数と
同じようなものです。
ショートカットを使って、アプリケーションを起動した時の
ウィンドウの表示方法を指定します。指定する値は ShowWindow()
関数の値がそのまま使えます。
よく使う値は
SW_SHOW ウィンドウを表示する
SW_HIDE ウィンドウを非表示にする
SW_MAXIMIZE 最大化して表示
SW_MINIMIZE 最小化して表示
SW_SHOWNORMAL ウィンドウをアクティブにして通常表示
SW_SHOWMAXIMIZED ウィンドウをアクティブにして最大化
SW_SHOWMINIMIZED ウィンドウをアクティブにして最小化
でしょうか・・・。
●コメントの設定
コメントはファイルの簡単な説明を書いておくためのものです。
psl->SetDescription( pDescription ); とやってコメントを
設定します。
pDescription はポインタなので、あらかじめ
char comment[256];
wsprintf( comment, "コメントだよ〜ぅ!" );
のようにして、コメントを格納した配列を用意しておいて
CreateShortCut( ショートカットのパス, 元のファイルのパス,
作業フォルダのパス, comment, コマンドライン );
というように、配列の先頭のポインタを CreateShortCut() 関数の引数に
渡します。( CreateShortCut() は自作関数です。上のサンプルをご覧下さい。)
●アイコンの設定
アイコンの変更 psl->SetIconLocation( pTargetPath, 0 ); と
なっていますが、SetIconLocation() の最初の引数には、アイコンが
含まれているファイルの絶対パスを指定します。
アイコンがあるファイルであれば、どの種類のファイルを指定しても
そのファイルからアイコンを抜き出してくれます。
2番目の引数は、ファイルにアイコンが複数登録されている時に
何番目のアイコンを選択するかを指定します。
1番目のアイコンが 0 です。
●コマンドラインの設定
psl->SetArguments( pArgs );
はコマンドライン(コマンドオプション、スイッチ)を設定します。
DOS窓を開いて実行するようなアプリケーションなら、よく
オプションを指定して起動したりするのですが、普通にウィンドウを
表示していろいろやるようなアプリケーションでは、あまり使いません
ねぇ・・・。
エディタなどではここにテキストファイルのパスを指定しておくと
そのテキストファイルをエディタに読み込んだ状態で起動することが
できます。
【 ショートカットのパスを Unicode に変換 】
作成するショートカットの設定が終わったら、最後に
ppf->Save( pathName, TRUE );
とやって、ショートカットを作成します。
ところが、この Save に指定できるのパス ( pathName ) は
2バイトの文字列でないといけません。
通常、Cで扱う文字列は char 型の配列を使うので1バイトです。
1バイトの文字列を2バイトに変換するために MultiByteToWideChar()
関数を使います。
【 オブジェクトの解放とCOMの終了 】
ショートカットが作成できたら、使用したオブジェクト psl, ppf を
解放します。これは必ず行います。
オブジェクトの解放が終わったら CoUninitialize() を使って
COMを終了します。
|