ShellExecuteを使ってコンパイルするとエラーが出る理由は?

このQ&Aのポイント
  • 特定の識別子が定義されていないため、ShellExecuteを使ってコンパイルするとエラーが発生します。
  • 前のプロジェクトでは定義せずに使用できた可能性もありますが、使い方が誤っている可能性もあります。
  • ShellExecuteを使ってDOS窓を開くための関数を作成しようとしていますが、m_hWndが定義されていないためエラーが発生しています。
回答を見る
  • ベストアンサー

ShellExecuteをつかって・・・

もしかしたら非常に簡単な問題かもしれないんですけど、 SDIベースでShellExecuteをつかって以下のような関数を作ってコンパイルすると、 ”error C2065: 'm_hWnd' : 定義されていない識別子です。” がでます。 前に別プロジェクトでやったときは特に定義せず使えたような気がするのですが、 何か使い方が間違っているのでしょうか? #include "stdafx.h" #include "FCwin.h" #include "MainFrm.h" #include "FCwinDoc.h" #include "FCwinView.h" ・・・中略・・・ int CFCwinApp::DosFcExe() { HINSTANCE ret = ShellExecute(m_hWnd,"open","command.com",NULL,"c:\\",SW_SHOW); if((int)ret <= 32 ){AfxMessageBox("DOS窓開けません",MB_OK);return 1;} return 0; }

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

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.3

こんにちは。itohhといいます。 m_hWndは、CWndクラスのメンバ変数です。 FCwinView.cppの中にCCwinViewクラスのメンバ関数としてDosFcExe()を定義するのは ダメなのでしょうか?CCwinViewクラスは、CWndクラスの派生クラスなので、m_hWndメンバ変数 が使用できます。 >前に別プロジェクトでやったときは特に定義せず使えたような気がするのですが CWndクラスの派生クラスで使用したのではないですか?

yasutaka
質問者

お礼

回答ありがとうございます。 CFCwinViewクラスで作り直したらうまくいきました。 お礼が遅れて申し訳ありませんでした。

その他の回答 (2)

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.2

こんにちは、honiyonです。  MFCの事はよく分かりませんが、 CFCwinApp:hWnd なんていうのを定義してみてはいかがですか?  CFCwinApp::DosFcExe() という関数の名前から予測してみました。  CFCwinAppというのがウインドウなら、CFCwinApp:hWndで、CFCwinAppウインドウのハンドルがとれるのではないでしょうか。  間違ってたらスイマセン。  参考になれば幸いです(..

yasutaka
質問者

お礼

なんとか解決しました。 いろいろありがとうございました。

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.1

こんにちは、honiyonです。   m_hWnd変数は定義されていますか?   前の別プロジェクトでは、m_hWnd変数が定義されていたのだと思います。  参考になれば幸いです(..

yasutaka
質問者

お礼

回答ありがとうございます。 すいません何処でどう定義すれば良いのでしょう。 前の別プロジェクトで検索をかけても定義位置が見つかりませんでした。 手元の参考書にも定義のところは書いてなくて、親ウィンドのハンドルを使う (CWnd::m_hWnd)ってかいてあるだけです。 てっきりMFCかなんかのグローバルなオブジェクトだと思っていたのですが・・・。

関連するQ&A

  • ShellExecuteのことで。

    はじめまして。 最近c言語のプログラミングを始めて、 cでフォルダを開くプログラムをテストしていましたら、 あるフォルダだけ、エラーが発生して、開けません。 フォルダのほうも色々見たのですが、 どうしてもわからないのでどなたか教えてください。 普通に開けたときは33だったのですが 開けなかったフォルダでの戻り値は42でした。 #include<stdio.h> #include<windows.h> int main(void){ HINSTANCE a; a=ShellExecute(NULL,"open","test",NULL,"D:\\",SW_SHOWNORMAL); printf("return = %d",a); return 0; }

  • visualstudioについて

    visual studio2008 c++ を使用しています. ダイアログ形式でアプリケーションを作成しています. ボタンを押すと画像のようなアプリケーションを起動してenterキーを送るようにしたいのですがうまく出来ません. void CMy6Dlg::OnBnClickedButton1() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 HINSTANCE ret = ShellExecute(m_hWnd, "open", "---Release\\scip_20_gd.exe", NULL, NULL, SW_SHOW); HWND hWnd = ::FindWindowEx(NULL, NULL, NULL, "---Release\scip_20_gd.exe"); ::SendMessage(hWnd,WM_SETFOCUS,0,0); ::SendMessage(hEdit, WM_KEYDOWN, VK_RETURN,0); if (ret <= (HINSTANCE)32) AfxMessageBox("シェル処理ができません.", MB_OK); } よろしくお願いします.

  • 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で別の変数が適当であれば、そちらを教えていただけませんか?

  • spawnl

    #include "stdafx.h" #include <process.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // TODO: この位置にコードを記述してください。 _spawnl(_P_WAIT, "chkbook.exe",...); return 0; } 上のようにして、MFCサンプルの ckhbook.exe  (引数はありません。) を呼び出そうとしましたが、上手く動きません。  どのように修正すれば良いのでしょうか?  コンソールプログラムの場合は、 簡単に呼び出せます。  よろしくお願いいたします。

  • c++ 電卓制作

    今使ったのはMicrosoft Visual Studio 2010のアプリ 以下のプログラムはダイアログボックス表示で0から9のボタン入れでます、普通の電卓作りたいです、計算のプログラムわからないので、どうすればいいですか? #include <windows.h> #include "resource.h" #include <tchar.h> // プロトタイプ宣言 BOOL CALLBACK DlgWndProc ( HWND , UINT , WPARAM , LPARAM ) ; void sub( int no , HWND hWnd ) ; static int cnt ; int a , b ; static int c ; // エントリポイント int APIENTRY WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { DialogBox(hInstance , MAKEINTRESOURCE(IDD_DIALOG1) , NULL , (DLGPROC) DlgWndProc ) ; return 0 ; } /* ------ ダイアログボックスウインドウプロシージャ ----- */ BOOL CALLBACK DlgWndProc ( HWND hWnd , UINT message , WPARAM wParam , LPARAM lParam ) { TCHAR s[80] ; switch( message ) { case WM_INITDIALOG : cnt = 0 ; return TRUE ; case WM_COMMAND : switch ( LOWORD(wParam) ) { case IDC_1 : sub ( 1 , hWnd ) ; return TRUE ; case IDC_2 : sub ( 2 , hWnd ) ; return TRUE ; case IDC_3 : sub ( 3 , hWnd ) ; return TRUE ; case IDC_4 : sub ( 4 , hWnd ) ; return TRUE ; case IDC_5 : sub ( 5 , hWnd ) ; return TRUE ; case IDC_6 : sub ( 6 , hWnd ) ; return TRUE ; case IDC_7 : sub ( 7 , hWnd ) ; return TRUE ; case IDC_8 : sub ( 8 , hWnd ) ; return TRUE ; case IDC_9 : sub ( 9 , hWnd ) ; return TRUE ; case IDC_0 : sub ( 0 , hWnd ) ; return TRUE ; case IDC_CLOSE : EndDialog( hWnd , 0 ) ; return TRUE ; default : return FALSE ; } default : return FALSE ; } } /* ------------------------------------- */ /* 表示 */ /* ------------------------------------- */ void sub( int no , HWND hWnd ) { TCHAR s[20] ; cnt *= 10 ; cnt += no ; wsprintf( s , TEXT("%d") , cnt ) ; SetWindowText( GetDlgItem(hWnd , IDC_EDIT1) , s ) ; }

  • ダイアログ表示後に1回だけ実行

    ダイアログベースのプログラムで、ダイアログを表示後にメッセージボックスを表示しようとして、下のプログラムのようにしたのですがダイアログが表示される前にメッセージボックスが表示されてしまいます。 ダイアログが表示された直後に1回だけ表示されるようにするにはどうすればいいですか? #include<Windows.h> #include "resource.h" HINSTANCE hinst; INT_PTR CALLBACK dlgproc(HWND,UINT,WPARAM,LPARAM); int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { hinst=hInstance; DialogBox(hinst,TEXT("mydlgmain"),NULL,dlgproc); } INT_PTR CALLBACK dlgproc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) { TCHAR moji[]=TEXT("ダイアログ表示"); switch(msg) { case WM_INITDIALOG: MessageBox(hwnd,moji,TEXT(""),MB_OK); return(INT_PTR)TRUE; case WM_CLOSE: EndDialog(hwnd,LOWORD(wp)); return (INT_PTR)TRUE; } return(INT_PTR)FALSE; } --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • DialogBox

    こんばんは 最近Windowsプログラムでツールを作ることになりまして 久しぶりにダイアログボックスを作成しようとして、いきなり躓きました;; DialogBox関数でダイアログを表示できないのですが、何か特別な処理って必要でしたっけ? 以下ソースコードです #include <windows.h> #include "resource.h" BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { DialogBox(hInstance, MAKEINTRESOURCE("IDD_DIALOG"), NULL, (DLGPROC)DialogProc); return 0; } BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: // ダイアログボックスが作成されたとき return TRUE; case WM_CLOSE: EndDialog(hWnd, IDOK); return TRUE; } return FALSE; } よろしくお願いします

  • msgが定義されていない

    Visual Studio2019でwindowsアプリケーションでゲームを作っているんですが、 どうやってもmsgが定義されていないが直りません。 #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); //WinMain関数 int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { //ウィンドウクラスの登録 //メインウィンドウの生成 //メッセージループ return (int)msg.wParam; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { //メッセージごとにやりたいことを記述する } return 0; } ご教示お願いします。

  • 何もしないメッセージだけ表示するウィンドウ

    ゲーム用に何もしないメッセージだけ表示するウィンドウを作りたいのですが、 猫でもわかるゲームプログラミングのコードが間違っているのか、 機能しません。 #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg){ } return 0; } このように、打ち込んだのですが、どこが間違っているのか解りません。 回答お願いいたします。

  • SMC-4DL-PCIボードでのプログラム

    コンテックさんのSMC-4DL-PCIボードを使用してアクチュエータを動かそうとしています(動かしたいのはオリエンタルモーターさんのELC)。 VC6.0を使用してプログラミングを行い、ビルドして.exeを実行すると何も起きません。 ボードに付属のサンプルプログラムではアクチュエータが動くので、配線ミスということは無いと思います。 おそらく組んだプログラムのどこかがおかしいのだとは思うのですが、恥ずかしながらプログラミング自体初めてなうえ、サンプルプログラムが難しすぎて解読が全く出来ないのでどうしたらいいか困っています。 卒論で使用するのでとにかく早く作り上げなければなりません。 足りない部分、間違いなどあればご指摘お願いします。 (ちゃんとライブラリファイルも追加してあります) #include "stdafx.h" #include "CSmc.h" #include "CSmcdef.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { long Ret; char *DeviceName ="SMC000" ; short Id ; Ret = SmcWInit( DeviceName , &Id ); short PulseMode ; short DirTimer ; PulseMode = 5; DirTimer = 1; Ret = SmcWSetPulseType( Id , 1, PulseMode , DirTimer ); Ret = SmcWSetInitParam( Id , 1); short MotionType ; short StartDir ; MotionType = 2; StartDir = 0; Ret = SmcWSetReady( Id , 1, MotionType , StartDir ); short Coodinate ; short StopPosition ; Coodinate = 1; StopPosition = 1000; Ret = SmcWSetStopPosition( Id , 1, Coodinate , StopPosition ) ; Ret = SmcWMotionStart( Id , 1); Ret = SmcWExit( Id ); return 0; }

専門家に質問してみよう