• 締切済み

デバッグについて教えてください

よろしくお願いします。 サンプルのソースを参考にして、『メモ帳』を作成しています。 プログラムの記述間違いや、コンパイル時のエラーは無いのですが、 出来上がった『メモ帳』に何かを書くと、いきなり 『文書保存の確認部分のメッセージ』が表示され、 ×ボタンで閉じようとすると、こんどは『上書き保存の部分のメッセージ』が表示されます。 こちらも閉じようとして、×ボタンを押すと再び、『上書き保存の部分』の表示となり、いつまでも繰り返します。 そこで、 { char szBuf[256]; wsprintf(szBuf, "x = %d, x"); MessageBox(hWnd, szBuf, "Debug", MB_OK); } と言うメッセージボックスを、『新規作成、ファイルを開く、文書保存の確認、上書き保存などの、各、関数部分に』挿入してデバッグしたのですが、何の変化もありません。 デバッグの方法に間違いがあると思うのですが不慣れなため気づきません。 詳しい方、アドバイスをお願いします。

noname#220054
noname#220054

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

> wsprintf(szBuf, "x = %d, x"); とりあえず、この文はまずいです。 ダブルクォーテーションの位置を見直してください。

noname#220054
質問者

お礼

//ファイルの読み込みと表示 lpszBuf[dwAccBytes] = '\0'; Edit_SetText(hEdit, lpszBuf); wsprintf(szTitle, szTitle_org, szFileTitle, dwSize); hMain = GetParent(hEdit); SetWindowText(hMain, szTitle); CloseHandle(hFile); GlobalUnlock(hMem); GlobalFree(hMem); //デバッグ return 0; } //名前をつけて保存 int MySaveAs(HWND hEdit) { HWND hWnd; //デバッグ用 OPENFILENAME ofn; HANDLE hFile; DWORD dwAccBytes; char *lpszBuf; int nLen; HGLOBAL hMem; nLen = GetWindowTextLength(hEdit); hMem = GlobalAlloc(GHND, sizeof(char) * nLen + 1); lpszBuf = (char *)GlobalLock(hMem); GetWindowText(hEdit, lpszBuf, nLen + 1); memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hEdit; ofn.lpstrFilter = "text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"; ofn.lpstrFile = szFile; ofn.lpstrFileTitle = szFileTitle; ofn.nFilterIndex = 1; ofn.nMaxFileTitle = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; ofn.lpstrDefExt = "txt"; ofn.lpstrTitle = "名前をつけて保存"; if(GetSaveFileName(&ofn) == 0) return -1; hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, lpszBuf, (DWORD)strlen(lpszBuf), &dwAccBytes, NULL); wsprintf(szTitle, szTitle_org, szFileTitle, nLen); SetWindowText(GetParent(hEdit), szTitle); if(CloseHandle(hFile) == 0) MessageBox(hEdit, "Error CloseHandle", "Error", MB_OK); SendMessage(hEdit, EM_SETMODIFY, FALSE, 0); GlobalUnlock(hMem); GlobalFree(hMem); //デバッグ return 0; } まだ、『上書き保存』と『文書保存の確認』の部分が残っているのですが、書き込めませんでした。

noname#220054
質問者

補足

アドバイス有難うございます。 そして、すみませんでした。『redfox63』さんへの補足を書いてしまいました。 早速ですが、アドバイスいただいた > wsprintf(szBuf, "x = %d, x"); の、部分をもう一度確認して、もう一度デバッグしてみます。 結果報告をしたかったのですが、本当に申し訳ありません。

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

# 開発環境や実行環境の情報も投稿しましょう WndProcのメッセージ処理のWM_COMMAND部分を投稿してみましょう switch文で分岐しているなら『break』または『return』が適切な位置に記述されているのか確認しましょう

noname#220054
質問者

お礼

//ファイルの読み込みと表示 lpszBuf[dwAccBytes] = '\0'; Edit_SetText(hEdit, lpszBuf); wsprintf(szTitle, szTitle_org, szFileTitle, dwSize); hMain = GetParent(hEdit); SetWindowText(hMain, szTitle); CloseHandle(hFile); GlobalUnlock(hMem); GlobalFree(hMem); //デバッグ return 0; } //名前をつけて保存 int MySaveAs(HWND hEdit) { HWND hWnd; //デバッグ用 OPENFILENAME ofn; HANDLE hFile; DWORD dwAccBytes; char *lpszBuf; int nLen; HGLOBAL hMem; nLen = GetWindowTextLength(hEdit); hMem = GlobalAlloc(GHND, sizeof(char) * nLen + 1); lpszBuf = (char *)GlobalLock(hMem); GetWindowText(hEdit, lpszBuf, nLen + 1); memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hEdit; ofn.lpstrFilter = "text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"; ofn.lpstrFile = szFile; ofn.lpstrFileTitle = szFileTitle; ofn.nFilterIndex = 1; ofn.nMaxFileTitle = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; ofn.lpstrDefExt = "txt"; ofn.lpstrTitle = "名前をつけて保存"; if(GetSaveFileName(&ofn) == 0) return -1; hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, lpszBuf, (DWORD)strlen(lpszBuf), &dwAccBytes, NULL); wsprintf(szTitle, szTitle_org, szFileTitle, nLen); SetWindowText(GetParent(hEdit), szTitle); if(CloseHandle(hFile) == 0) MessageBox(hEdit, "Error CloseHandle", "Error", MB_OK); SendMessage(hEdit, EM_SETMODIFY, FALSE, 0); GlobalUnlock(hMem); GlobalFree(hMem); //デバッグ return 0; } まだ、『上書き保存』と『文書保存の確認』の部分が残っているのですが、書き込めませんでした。

noname#220054
質問者

補足

アドバイス有難うございます。 開発環境として 1、BorlandC++5.5 2, VC++2005 の両方を使ってみましたが結果は同じでした。 こちらが、WndProcの部分です、アドバイスを参考に確認したいと思います、 また、お気づきの所がありましたら、再度アドバイスいただけると助かります。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; static HWND hEdit; switch (msg){ case WM_CREATE: //エディトコントロールの作成 hEdit = CreateWindow("EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | WS_HSCROLL, 0, 0, 0, 0, hWnd, (HMENU)ID_EDIT, hInst, NULL); strcat(szTitle, "「無題」"); SetWindowText(hWnd, szTitle); Edit_LimitText(hEdit, 0); break; case WM_SIZE: //ウィンドウサイズの調整 MoveWindow(hEdit, 0, 0, LOWORD(lp), HIWORD(lp), TRUE); break; case WM_COMMAND: switch (LOWORD(wp)){ case IDM_NEW: MyNew(hEdit); break; case IDM_OPEN: MyOpen(hEdit); break; case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; case IDM_SAVE: MySave(hEdit); break; case IDM_SAVEAS: MySaveAs(hEdit); break; } break; case WM_SETFOCUS: SetFocus(hEdit); break; case WM_CLOSE: id = MyConfirm(hEdit); if(id == IDCANCEL) break; id = MessageBox(hWnd, "終了してもいいですか", "確認", MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hEdit); //エディットコントロールの破棄 DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //新規作成 int MyNew(HWND hEdit) { HWND hWnd; //デバッグ用 int id; id = MyConfirm(hEdit); if(id == IDCANCEL){ return -1; } Edit_SetText(hEdit, ""); SetWindowText(GetParent(hEdit), "メモ帳もどき[無題]"); strcpy(szFile, ""); { //デバッグ char szBuf[256]; wsprintf(szBuf, "x = %d, x"); MessageBox(hWnd, szBuf, "Debug", MB_OK); } return 0; } //ファイルを開く int MyOpen(HWND hEdit) { HWND hWnd; //デバッグ用 int id; HWND hMain; DWORD dwSize = 0L; OPENFILENAME ofn; HANDLE hFile; DWORD dwAccBytes; char *lpszBuf; HGLOBAL hMem; id = MyConfirm(hEdit); if(id == IDCANCEL) return -1; memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hEdit; ofn.lpstrFilter = "text(*.text)\0*.txt\0ALL files(*.*)\0*.*\0\0"; ofn.lpstrFile = szFile; ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFile = MAX_PATH; ofn.nMaxFileTitle = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; ofn.lpstrDefExt = "txt"; ofn.lpstrTitle = "ファイルオープン"; if(GetOpenFileName(&ofn) == 0) return -1; hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); dwSize = GetFileSize(hFile, NULL); hMem = GlobalAlloc(GHND, sizeof(char) * dwSize + 1); if(hMem == NULL){ MessageBox(hEdit, "メモリを確保できません", "メモ帳もどき", MB_ICONEXCLAMATION | MB_OK); return -1; } lpszBuf = (char *)GlobalLock(hMem); ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);

関連するQ&A

  • ダイアログなどの文字列が文字化けする

    VS2005でWindowsプログラムをし始めたばかりの初心者です。 タイトルのことで質問があります。 参考書として「猫でもわかるwindowsプログラミング」 というのを使っているのですがそのとおりにやっても文字化けするところか エラーでテストランできないです。 たとえば、デバッグ用にダイアログを表示させる方法として { char szBuf[256] wsprintf(szBuf, "x= %d",x); MessageBox(hWnd,szBuf,"Debug",MB_OK); } というものがのっているのですがとりあえず 「空のプロジェクト」を選択しないで普通に動く状態で実行させてみても「型が違うのでキャストしろ」というメッセージが出ます。 それでキャストするとエラーは出ないのですが文字化けします。 もっと簡単に { MessageBox(hWnd,"文字","Debug",MB_OK); } とかしてもやっぱり文字化けします。 しかしなぜか文字列に1から9を指定したときはそのまま表示されます。 10以上は容赦なく文字化けします。 参考書のほうはVS C++.NETを対象としているそうなのですがそのせいかもしれません。 どなたかわかる方よろしくお願いします。

  • 拡張子htmlの文書を.上書き保存できません

    メモ帳で作成した拡張子htmlの文書を.上書き保存できません。 上書き保存しようとすると「ファイル・・・・・を作成できません。パスおよびファイル名が正しいか確認してください」というメッセージが表示されます。 名前を付けて保存の場合も同様です。 ワードパッドで作成して上書き保存しようとすると「ドキュメント・・・・・はほかのアプリケーションで使われているためアクセスできません」と表示されます。 なお、拡張子.txtの場合は上書き保存できます。 上書き保存できるようにする方法を教えていただけませんでしょうか。

  • MessageBoxでの、書式指定を教えて下さい。

    Windowsで、Visual C++6.0を、使っています。 double max; char szBuf[256]; wsprintf(szBuf,"左 Yの最大値は、%d ",max); MessageBox(hWnd, szBuf, "各最大値", MB_OK); 上記を、実行した時、正しい値を表示してくれません。 デバッガーで見ると、maxには、正しい値、768.55というような値が、入っているようです。 %dを、%fとすると fを表示して値を表示しません。 double型の値を表示させるには、どうしたらいいのでしょうか? 教えて下さい。どうぞよろしくお願いします。

  • 16進数の表示ができません。

    シリアルポートで受信したバイナリデータを表示させると、 正しい値が出ないのですが、どうしてでしょうか? 受信するデータは16進数で 06 02 81 07 00 bb 01 b4 00 32 なのですが、以下のソースで実行すると、 6 2 ffffff80 7 0 ffffffbb 1 ffffffb4 0 32 と表示されました。 また、「データ受信完了」というメッセージが出ないのですが、 出なくてもデータ受信は出来ているのでしょうか? char szBuf[256]; char rdBuf[10]; char* prdBuf; DWORD dwCount; DWORD dwRead; dwCount = 10; prdBuf = &rdBuf[0]; if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,INFINITE); == WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&dwCount,TRUE)) MessageBox("データ受信完了"); } } else MessageBox("データ受信エラー","試作1",MB_ICONSTOP); } wsprintf(szBuf,"文字 = %x %x %x %x %x %x %x %x %x %x", rdBuf[0],rdBuf[1],rdBuf[2],rdBuf[3],rdBuf[4],rdBuf[5],rdBuf[6],rdBuf[7],rdBuf[8],rdBuf[9]); MessageBox(szBuf); よろしくお願いします。

  • 書き換えたワードのファイルの保存方法

    過去に作成したワード文書を開いて、再編集したあと、右上の「閉じるボタン」をクリックすると、普通なら、「~は変更されています。保存しますか?」のメッセージと共に、「はい」「いいえ」「キャンセル」を選択する画面が表示されるはずなのですが、表示されずにワード文書が閉じてしまいます。  上書き保存するには、編集画面で上書き保存しておかないとできません。PCはXP、ワード2002です。

  • 書き換えたワードのファイルで「閉じるボタン」をクリックすると直ぐに閉じてしまう。

     過去に作成したワード文書を開いて、再編集したあと、右上の「閉じるボタン」をクリックすると、普通なら、「~は変更されています。保存しますか?」のメッセージと共に、「はい」「いいえ」「キャンセル」を選択する画面が表示されるはずなのですが、表示されずにワード文書が閉じてしまいます。  上書き保存するには、編集画面で上書き保存しておかないとできません。PCはXP、ワード2002です。

  • FDにアクセスできません

    一度FDで作ったtxt文書をメモ帳でひらき、続きを作成して上書き保存をしてメモ帳を終了しました。その後ネットをしてまたそのファイルを開こうとしたのですが「A\にアクセスできません」といったメッセージが出てきて「再施行」のボタンを押しても同じメッセージがでてくるだけです。 ファイルもフロッピーも別にいじってないのになんで開けないのでしょうか。心当たりとしては、もしかしたらフロッピーを抜くのが早すぎたのかもしれないとも思いますがハッキリとは解りません。 この原因と対処法がありましたらぜひ教えて下さい!バックアップもとってないのですごく困ってます。

  • デバッグ終了後、再度デバッグ動作できない

    簡単な電卓のプログラムを組んで、ビルド後デバッグして、一旦デバッグ終了のためにフォームの右上の×ボタンで終了し、再度デバッグ動作を実行するとデバッグに入れなくなります。 一旦Code Gear C++ Builder 2009を終了使用とすると、”デバッグを終了しますか?”というメッセージボックスが出てきます。 そのままIDEの終了動作を行うと”デバッグプロセスを初期化できません のプロセスを終了する際にデバッガで致命的なエラーが発生しました。作業中のファイルを保存し CodeGear C++ Builderを再起動してください。” このようなメッセージボックスが出てきて強制終了してから起動しないかぎり再度デバッグ動作ができないのですが、解決方法ご存じの方いらっしゃいませんでしょうか? 現在使用しているのはCode Gear C++ Builder 2009 です。

  • VisualStudio2005で「デバッグ開始」「デバッグなしで開始」がうまくいかない

    VisualStudio2005で開発をしているのですが、 あるときPCが強制終了する際に、開発途中の状態のままVisualStudioも終了してしまいました。 「~を保存しますか」というダイアログがでていたのですが、良く分からず「いいえ」を選択してしまい、次に立ち上げたとき、「デバッグ開始」ボタンを押すと「~がありません」と(~のところはもう覚えていません……)出たのでVisualStudioのexeを指定しました。 以後、「デバッグ開始」「デバッグなしで開始」を押しても、作成中のプログラムを実行してくれず、VisualStudioがもう一つ立ち上がってしまいます。 これを正常にするにはどこの設定をどう変えれば良いのでしょうか?

  • Doja3.5 + Eclipse3.1.1でのデバッグがまともに動きません。

    Doja3.5 + Eclipse3.1.1 でのデバッグ方法をご存知の方いないでしょうか? 現状は 1.[実行]-[構成及び実行]⇒[デバッグモード起動]にチェック⇒[実行] 2.[デバッグ]-[構成及びデバッグ]⇒[リモートJavaアプリケーション]⇒該当するプロジェクトを選択  ⇒パラメータの類は変えずに[デバッグ] と進めるとEclipseを起動した初回のデバッグのみデバッグが進み、 設定したブレークポイント等まで進んでくれるのですが 2回目からコンソールには Connecting to 127.0.0.1 on port 2800 Waiting for debugger on port 8000 Connection received. と表示される所まで進むのですが端末エミュレータウィンドウが表示されなかったり 端末エミュレータウィンドウまで表示され doja_g.exeアプリケーションエラー 0x00412301の命令が0x00000004のメモリを参照しました。 メモリがreadになることはできませんでした。 のエラーメッセージが表示されデバッグできません。 Doja3.5 + Eclipse3.1.1の組み合わせではまともにデバッグはできないのでしょうか? http://eclipsewiki.net/eclipse/?FrontPage や  http://oshiete1.goo.ne.jp/kotaeru.php3?q=1438386 等も参考にさせて頂いたのですがデバッグがまともに進みません。 原因に心当たりがある方、どうかご指導頂けないでしょうか? よろしくお願いします。 できるならFOMA900以降でアプリを作成したいのでDojaのバージョンは3.5としています。 Eclipseの3.0以降はDojaが対応していないのでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう