C++からShellExecuteを利用して、Windowsプログラムを起動しようとしたが、起動しない。
環境
- Windows 7 64bit.
- Visual Studio Expess 2012
int main(int argc, char* argv[])
{
ShellExecute(NULL,"open","notepad.exe",NULL,NULL,SW_SHOWNORMAL);
return 0;
}
ShellExecuteの定義であるShellExecute 関数を見て,LPCTSTR型でキャストしても動かない。困ったときのネットにも、助けになるような情報がない。
それでも頑張って調べてみると、文字列にはプレフィックスとして"L"を追加する必要があるらしい。これを、ワイド文字列いう。Unicodeを示すための型らしい。以下のページが詳しい。
というわけで、こんなふうに変更すればよい。
int main(int argc, char* argv[])
{
ShellExecute(NULL, L"open", L"notepad.exe",NULL,NULL,SW_SHOWNORMAL);
return 0;
}
これで、動作するになった。めでたしめでたし。
UniCode対応しなければよいとうい手もある
そしてこれは、Windowsプログラミングの常識らしい。常識だからネットで調べてもないわけだ。
これを意識しない方法もある。Visual Studioのプロジェクトの
- プロパティ -> 全般 -> 文字セット
- マルチ バイト文字セットを使用する
を選択すると、OK.これで、以下のようなコードでも動作する。
int main(int argc, char* argv[])
{
ShellExecute(NULL, (LPCSTR)"open", (LPCSTR)"notepad.exe",NULL,NULL,SW_SHOWNORMAL);
return 0;
}
わけがわからない、winodwsプログラミング。。。。
追記 130819
すでに変数に格納した文字を変換するためには、mbstowcs_sを使います。これで、ピンポイントで文字列を変換できる。