山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他コマンドプロンプトでショートカットを作成する(32/64bit)
概要
COMのIShellLink,IPersistFileインターフェースを使用してショートカットを作成します。
本プログラムはコマンドプロンプト上で動作し引数でショットカット名とリンク先を指定することによりショットカットを作成します。
テスト環境
コンパイラ
Visual C++ 2008/2013 Express 32/64bit UNICODE実行環境
Windows 7 Enterprise Service Pack 1 64bitWindows 10 Home
バッチファイルでの使用
バッチファイルから使用する場合、環境変数が使えるのでProgram FilesやWindowsフォルダーを直接指定しないで済みます。
以下にメモ帳のショートカットをディスクトップに作成する例を示します。
以下にメモ帳のショートカットをディスクトップに作成する例を示します。
makelnk "%homedrive%%homepath%¥desktop¥メモ帳.lnk" "%systemroot%¥notepad.exe"
プログラムソースの概要
makelnk.cpp
_tmain
COMの初期化
CoInitialize APIによりCOMを初期化します。ショートカットを扱うための準備
CoCreateInstance関数によりIShellLinkオブジェクトを作成します。QueryInterface関数によりIPersistFileインターフェースの作成します。
複数のショートカットを扱う場合でも同時に1個しか扱わない場合は準備は1回で結構です。(STAでCOMを初期化しているのでスレッド単位で必要)
ショートカットの作成
SetPath
IShellLinkのメンバであるSetPathでリンク先を設定します。IShellLinkには本プログラムで使用しているSetPathの他に以下のようなメンバーがあります。
SetIconLocation アイコンを設定
SetArguments コマンドラインを設定
SetHotkey ホットキーを設定
SetShowCmd ウィンドウの初期表示状態を設定
一部の項目のみ変更する場合は、Load,GetPathでショートカットの内容を取得した後、変更します。
Save
IPersistFileのメンバであるSaveでショートカットのファイル名を指定することによりショートカットが作成されます。ショートカット使用後の後始末
IShellLink,IPersistFileをReleaseで解放します。COMの解放
CoUninitialize APIによりCOMを解放します。ソースコード
makelnk.cpp
// 引数で指定したショートカットを作成する。
// Visual C++ 2008/2013 Express (UNICODE 32/64bit)
#include <stdio.h>
#include <windows.h>
#include <shobjidl.h>
#include <shlguid.h>
#include <tchar.h>
#include <locale.h>
int _tmain(int argc,TCHAR** argv){
_tsetlocale(LC_ALL, _TEXT("")); // UNICODE文字を標準出力に正しく表示できるように
if(argc != 3){
_tprintf(_TEXT("引数が間違っています。¥n使い方¥n makelnk ショートカットファイル名 ショットカットのリンク先¥n"));
exit(1);
}
// ショートカットのファイル名
TCHAR* file_pass=argv[1];
// ショートカットのリンク先パス
TCHAR* link_pass=argv[2];
if( FAILED( CoInitialize(NULL) )){ // COMの初期化 STA(シングルスレッドアパートメント)
MessageBox(0,_TEXT("COMの初期化に失敗しました"),_TEXT("エラー"),MB_OK);
return -1;
}
IShellLink *m_pShellLink=NULL;
IPersistFile *m_pPersistFile=NULL;
// IShellLinkオブジェクトを作成
if(CoCreateInstance( CLSID_ShellLink , NULL , CLSCTX_INPROC_SERVER ,IID_IShellLink ,(LPVOID *)&m_pShellLink)==S_OK){
// IPersistFileインターフェースの作成
if(m_pShellLink->QueryInterface( IID_IPersistFile, (LPVOID *)&m_pPersistFile )==S_OK){
// リンク先の設定 複数のショートカットを処理する場合は以下4行を繰り返す
m_pShellLink->SetPath(link_pass);
if(m_pPersistFile->Save(file_pass,TRUE)!=S_OK){ // ショートカットファイルへ保存
MessageBox(0,_TEXT("リンク先が設定できませんでした。"),_TEXT("エラー"),MB_OK);
}
m_pShellLink->Release(); // IShellLinkオブジェクトの開放
m_pPersistFile->Release(); // IPersistFileインターフェースの開放
}
}
CoUninitialize(); // COMの解放
return (int)0;
}
ソースコードと実行ファイルのダウンロード
ダウンロード makelnk.zip(39.6kB)
makelnk.cpp makelnk.exe test.bat
Copyright (C) 2012 山本ワールド All Rights Reserved.