• ベストアンサー

VC++ Express m_hWnd

VC++ Express edition 2008で、Command Promptを起動、directoryを替えようとして、 HINSTANCE ret = ShellExecute(m_hWnd,"open","cmd.exe",NULL,"c:\\Program Files",SW_SHOW) で、m_hWndが定義されていないとエラーが出てきました。VC++2005 standard version では出るようですが、Express edition 2008では定義されてないようです。この部分、Expression editionではどのように定義するのか教えてください。2008 Express editionで別の変数が適当であれば、そちらを教えていただけませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.4

Express EditionにはMFCライブラリは入っていないはずです。Standard Editionには入っています。 で、m_hWnd変数はCWndクラスのメンバ変数なのですが、そのCWndクラスまたはその派生クラスを使っているんでしょうか? また、ShellExecute関数はWin32APIです。MFCライブラリの関数ではありません。 ご提示された、”外部プログラムを実行する”というのは、通常C++/CLIで、.Net Frameworkに用意されている関数やクラスでは実現できないコードを書くためにWin32APIや外部DLLの関数を呼び出したりするために使用するものでしょう。 勉強のためならばいいのですが、そうでないのならC++/CLIでShellExecute関数などのWin32APIありきなコードを書くのはやめることをおすすめします。 補足 ShellExecute関数のm_hWndの部分は、親ウィンドウのハンドルを渡します。今回の場合、Formクラスが親ウィンドウになるので、以下のような記述になるでしょう。 HINSTANCE ret = ShellExecute((HWND)this->Handle,"open","cmd.exe",NULL,"c:\\Program Files",SW_SHOW);

Syosin3
質問者

お礼

お忙しい中、ありがとうございました。もう一度C/C++で整理しなおします。

その他の回答 (3)

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.3

>HINSTANCE ret = ShellExecute(m_hWnd,"open","cmd.exe",NULL,"c:\\Program Files",SW_SHOW) C++/CLIでこれと等価になりそうなのは以下のようなコードになると思います。 Process^ objProcess = gcnew Process; objProcess->StartInfo->FileName = "cmd.exe"; objProcess->StartInfo->WorkingDirectory = "c:\\Program Files"; bool bSuccess = objProcess->Start(); しかし、ShellExecute(Win32API)、m_hWnd変数(MFC)、System::Windows::Forms::Form(C++/CLI)など、いろいろとごちゃ混ぜに使用しようとしているように見受けられます。これはやめたほうがいいです。特にMFCとC++/CLIは同時には使用できないです。 また、C++/CLIは、通常のC/C++とはソースコードの記述にかなり違いがあり、いきなりC++/CLIを使うのはお勧めできないです。 もし、通常のC/C++(Win32APIを含む)で書くのなら、プロジェクトを最初から作り直して始めることをオススメします。 また、C++/CLIで書くのなら、Win32APIやMFCのライブラリを利用することはやめることをオススメします。(一応Win32APIを併用する方法もあるがかなりややこしい)

Syosin3
質問者

お礼

回答ありがとうございます。私は少し混乱しています。Visual C++ 2005 standard、Visual C++ 2008 standardは、C++/CLIで、これらは、MFCライブラリを使えると思っています。"Visual C++2005 シニア編 林 晴比古"によれば、"外部プログラムを実行する P307"では、ShellExecute関数の使用が見られます。2008 Visual C++ Express editionではダメで、2005 or 2008 Visual C++ 2005, 2008 standard versionでは使えるという事は無いのでしょうか?

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

そのコードはどうみてもC++/CLIを使われてますね。 C++/CLIとC++は似て非なるものですので、リファレンスを探すしか無いですね。 私もC++/CLIは詳しくないですが"Processクラス"で出来るみたいです。 ※C++/CLIはVBやC#と同じく.NET Frameworkで動くマネージドコードのプログラミング環境です。なので、exeファイルは機械語ではなくMSILコードで出力されるので理解しておいて下さい。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

m_hWndは MFCというVC++のWindows用クラスライブラリを使う場合にCWndクラスなどのウィンドウハンドルを記憶しておく変数です Expressバージョンで作成しているなら Win32APIでやっていると思います この場合 m_hWndは自分で定義しない限りありません メインウィンドウを作成した際に記憶している HWND型の変数があると思います これを ShellExecuteに与えてみましょう

Syosin3
質問者

補足

早速回答ありがとうございます。デザインウインドウで入っていますので、自動的にVC++のプログラムが作成されてます。中を見てみたのですが、HWND型の変数が見当たりません。どのように宣言すればいいのでしょう。基本的な質問ですいません。 以下プログラムのコピーです。 #pragma once #include "windows.h" #include "commctrl.h" #include "winNT.h" namespace Startup { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Form1 の概要 /// /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた /// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを /// 変更する必要があります。この変更を行わないと、 /// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、 /// 正しく相互に利用できなくなります。 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // } protected: /// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Button^ button1; protected: private: /// <summary> /// 必要なデザイナ変数です。 /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// デザイナ サポートに必要なメソッドです。このメソッドの内容を /// コード エディタで変更しないでください。 /// </summary> void InitializeComponent(void) { this->button1 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(103, 108); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 0; this->button1->Text = L"button1"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 12); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(292, 266); this->Controls->Add(this->button1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); } #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { HINSTANCE ret = ShellExecute(HWND hwnd,"open","cmd.exe",NULL,"c:\\Program Files\\Wireshark",SW_SHOW); } }; }

関連するQ&A