• このエントリーをはてなブックマークに追加

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を示すための型らしい。以下のページが詳しい。

文字セットとTCHARと

というわけで、こんなふうに変更すればよい。

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を使います。これで、ピンポイントで文字列を変換できる。

  • VC++メモ:マルチバイト文字列(char*)とワイド文字列(WCHAR*)の変換 | フィロの村note