SHELLEXECUTEINFO構造体のlpVerbメンバに"properties"を指定するのですが、
これだけだと、そんな動作はありません、と実行時にエラーがでます。
ShellExecuteExはhInstAppメンバに31をセットしていることから、どうやら、
・「open」句はファイルに関連付けられたアプリケーションで起動、
・「print」句は既定の印刷プログラムを起動、
と同じ意味で、
「properties」句に関連付けられた動作を行おうとし、それが定義されていないからエラーとなった模様。
ここで、fMaskメンバに「SEE_MASK_INVOKEIDLIST」を指定すると、
「properties」句は「プロパティダイアログを開く」ことだと分かってくれるようです。
※エクスプローラの右クリックメニューの「プロパティ」と同じ動作をするよう指定したってこと?
"INVOKE"とか"IDLIST"とかいう言葉がそれを匂わせる。
※ウェブ上には
ShellExecuteExを使ってプロパティダイアログを表示する方法として
「SEE_MASK_INVOKEIDLIST」マスク指定なしのソースを書いている記事がいくつかあったけど、
一体どうやって実現したのか教えて欲しい。
:
;
しかし。
ShellExecuteExであっても、プロパティダイアログは瞬時に表示して閉じてしまう。
プロパティダイアログを永続的に表示しておくには、
ShellExecuteExを実行した後に何らかのpauseをかけておかなくてはならない...
# include <stdio.h>
# include <windows.h>
# include <shellapi.h>
int main(int argc, char** argv)
{
int ret;
char buf[1];
if( argc < 2 ){
printf(" [×] ファイルを指定してくださぃ\n");
return -1;
}
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_INVOKEIDLIST;
sei.lpVerb = "properties";
sei.lpFile = argv[1];
sei.nShow = SW_SHOWNORMAL;
if( ShellExecuteEx(&sei) == TRUE ){
if( (int)sei.hInstApp > 32 ){
printf(" [〇] ShellExecuteEX succeeded. %d\n", sei.hInstApp);
ret = 0;
}
}
else{
printf(" [×] ShellExecuteEX failed. %d\n", sei.hInstApp);
ret = -2;
}
//※入力待ちを作ってこのプロセスを止めておかないとプロパティダイアログが閉じてしまう。
printf("enter any key...");
gets_s(buf, 1);
return ret;
}