例外処理 (初回) は XXXX.exe (MFC42D.DLL) にあります: 0xC0000005: Access Violation。

このQ&Aのポイント
  • プログラムを実行させた時、特定の場所でエラーが出てしまいます。
  • 何方かどの辺を調べれば良いか等のアドバイスをお願い致します。
  • 上記はデータシリアル通信の送信用メンバ関数を通した時に急に発生します。
回答を見る
  • ベストアンサー

例外処理(初回)についてのご質問

プログラムを実行させた時、下記の様なメッセージが出力されたあとに、特定の場所でエラーが出てしまいます。 色々と試して見たのですが、解決出来ずに困っております。何方かどの辺を調べれば良いか等のアドバイスをお願い致します。 <エラーメッセージ> "例外処理 (初回) は XXXX.exe (MFC42D.DLL) にあります: 0xC0000005: Access Violation。" <停止場所> CWnd* CWnd::GetDlgItem(int nID) const { ここです→ASSERT(::IsWindow(m_hWnd)); if (m_pCtrlCont == NULL) return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID)); else return m_pCtrlCont->GetDlgItem(nID); } <エラーが発生するプログラム> BOOL CComProgramDlg::BinarySend(BYTE SendData[], unsigned long SendLength) { int Ret; unsigned long Len; ここら辺です→CStatic* pStic1 = (CStatic*)GetDlgItem(IDC_MSG_STATIC); Ret = WriteFile(m_hComm, &SendData[0], SendLength, &Len, NULL); if(!Ret)  return(FALSE); if(SendLength > Len)  return(FALSE); pStic1 -> SetWindowText("データを送信しました。"); return(TRUE); } 上記はデータシリアル通信の送信用で10回程度、このメンバ関数を通した時に急に発生します。 よろしくお願いいたします。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>なぜ数回後にメモリ破壊が発生してしまうのでしょうか? たまたま。 >何か心辺りや推測,経験談で結構ですので教えて下さい。 単純なところですと、 ・領域のサイズ不足。バッファーオーバーフロー。 ・delete等で間違ったポインタを渡して関係ない領域を解放。 ですかね。 まぁ、おそらく読み込み用か、それの管理部分の領域不足でしょうね。

tamajun
質問者

お礼

ありがとうございました。 今一度、見直してみます。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

ASSERTで止まる理由: ウィンドウハンドルが無効 ウィンドウハンドルが無効になる理由: 1.ウィンドウが無い 2.変数の内容が書き換わった。 ですので、ウィンドウが存在しているのでしたらm_hWndの内容が変わっている可能性があります。 >上記はデータシリアル通信の送信用で10回程度、このメンバ関数を通した時に急に発生します。 ここでメモリ破壊してませんか?

tamajun
質問者

補足

はい。しているみたいです。 デバックモードにて確認してみるとm_hWndの値が評価出来ない状態となってしまっています。 なぜ数回後にメモリ破壊が発生してしまうのでしょうか? 何か心辺りや推測,経験談で結構ですので教えて下さい。

関連するQ&A

  • コンボボックスへの追加

    C++全くの初心者です。 VC++ 6.0でコンボボックスに文字列を追加したいだけなんですが、出来ないで困っています。 いろんな本やこの過去の回答などで、GetDlgItemのパラメタにコントロールIDを渡しているのを見ますが、その通りにするとコンパイルエラーになります。 コード入力サポート(キー入力中に表示されるパラメタの説明)を見ると、 void GetDlgItem(int nID, HWND *phWnd) と表示されます。 参考にしている入門書では CComboBox* pCB=(CComboBox*)GetDlgItem(IDC_xxx); とかかれていて、入門書の付属のCDのソースもそうなっており、コンパイルはちゃんと通ります。 VCのヘルプを見ると確かに CWnd* GetDlgItem( int nID ) const; void CWnd::GetDlgItem( int nID, HWND* phWnd ) const; の2通りがあります。 GetDlgItemと入力するとなぜvoid型のGetDlgItemが選択されるんでしょうか。 phWndには何を渡せばいいんでしょうか。 また、CWnd*を返すGetDlgItemを呼びたいんですが、どうすればいいんでしょうか。 よろしくお願いします。

  • IEコンポーネント(CWebBrowser2)を編集モードにする方法(VC++6.0)

    MFCAppウィザードで作ったSDIのプログラムで IEコンポーネント(CWebBrowser2)をフォームに表示し それを編集モードにしたいと思っています。 リソースエディタでフォームにコントロールを貼り付けています。 http://www.nitoyon.com/vc/tips/ie_component.htm こちらを参考に、IWebBrowser2のポインタを取得し そこからIHTMLDocument2を取ってデザインモードに したいのですが、うまくIWebBrowser2のポインタを 取得することが出来ません。 CWnd* pIE = (CWnd *)GetDlgItem(IDC_EXPLORER1); if (pIE == NULL) return; // コントロールのハンドルを得る HWND hWnd = pIE->GetSafeHwnd(); // 使えるかどうかチェック if (hWnd != NULL && ::IsWindow(hWnd) != 0) { CComPtr<IUnknown> punkIE; if (AtlAxGetControl(hWnd, &punkIE) == S_OK){//ここで失敗する CComQIPtr<IWebBrowser2> pWB2 = punkIE; if(pWB2 != NULL){ CComPtr<IDispatch> pDisp ; pWB2->get_Document( &pDisp) ; CComQIPtr<IHTMLDocument2> pDoc = pDisp ; pDoc->put_designMode(L"On"); } } }

  • 2重軌道防止のサイトの説明

    に従って以下のようにしましたが 2重起動を発見してやめるために return false; としていますが return true; としたり booleanをやめて return int(0) とするとどうなるのでしょうか? WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; HWND hW,hPW; MSG ms; unsigned pos; HANDLE hMutex; hPW=FindWindow("goo","I am good."); hMutex=CreateMutex(NULL,TRUE,"UniqueName"); if(!hMutex)return FALSE; if (GetLastError()==ERROR_ALREADY_EXISTS) { ShowWindow(hPW,SW_RESTORE); SetForegroundWindow(hPW); return FALSE; } ・・・・・・・・・・・・・・・・・・・・

  • 1と表示させたいが12と表示される

    windows XP VC++.net 2003です。 よろしくお願いします。 症状は毎回コピーアンドペーストでプログラムを書くよりも 関数化してソースをきれいにしようと思い BOOL ButtonNumber (int bNumber,HWND hWnd) { long z; char sBuff[100]; char number[100]; wsprintf(number,"%d",bNumber); z = GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff,99); if(z == 0){ SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),number); return TRUE; } if(z == 10){ //桁数が多すぎる警告メッセージ MessageBox(NULL,"桁数が多すぎます。","警告",MB_OK); return TRUE; } z = atol(sBuff); wsprintf(sBuff,"%d1",z); SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff); return TRUE; } という関数を作りました。 numberに1という数字が入っていてエディットボックスに1と表示されるはずなのですが12と表示されてしまいます。 ためしにnumberに12と入れてみると表示されるのが122 123と入力すると1232と表示されてしまいます。 SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),number); どこも間違っていないように思いますが・・なんででしょう・・ 関数化せずmainに直接書き込んでいけば正常に1と表示されます・ switch (LOWORD(wParam)) { case IDC_BUTTON1: ButtonNumber(1,hWnd); case IDC_BUTTON2: a = GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff,99); if(a == 0){ SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),"2"); return TRUE; } if(a == 10){ //桁数が多すぎる警告メッセージ MessageBox(NULL,"桁数が多すぎます。","警告",MB_OK); return TRUE; } a = atol(sBuff); wsprintf(sBuff,"%d2",a); SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff); return TRUE; この場合BUTTON1は12と意図しない表示をしますが BUTTON2はちゃんと2と表示されます。 非常に困っていますよろしくお願いします。

  • MFC CSplitter内にコントロールを表示させるには

    Viewクラスを作り中に表示させる方法はわかったのですが、 分割ウィンドウ内にListCtrlなどを表示させるにはどうすればいいのでしょうか? コンパイルはできるのですが、afxcmn.inl Line:266の ASSERT(::IsWindow(m_hWnd));でエラーが出てしまいます。 何がいけないのか教えてください。お願いします。 //.h CSplitterWnd m_wndSplitter; virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext); //.cpp BOOL CWnd::OnCreateClient(LPCREATESTRUCT /*lpcs*/,CCreateContext* pContext) { if(!m_wndSplitter.CreateStatic( this, 1, 2, WS_CHILD | WS_VISIBLE ) ) return FALSE; if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CListCtrlA),CSize(200,300),pContext)) return FALSE; if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CListCtrlB) ,CSize( 200,300),pContext)) return FALSE; }

  • midiの再生が思うようにできません

    ファイルの文字列を1行ずつ読み込み、文字列の数字の範囲によって再生する音楽を変えるプログラムを作成していますが、読み込んだ文字列とは無関係に、ループの初めの範囲で指定してある音楽しか再生されません。読み込んだ文字列ごとに再生音楽を変えるにはどうすればいいのでしょうか?分かる方ご教授願います。 環境:WindowsXP, Visual C++ 2008 Express Edition 以下がプログラムのソースの一部です。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { FILE *fp; errno_t err; TCHAR buf[30]; TCHAR *temp; int m=0, n=0; switch(msg) { case WM_CREATE: CreateWindow(TEXT("BUTTON"), TEXT("Play"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,120, 100, 70, 70, hWnd, NULL, hInst, NULL); break; case WM_COMMAND: err = _tfopen_s(&fp, TEXT("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\process\\process\\Corner.txt"), TEXT("r+")); if(err != 0) break; temp = (TCHAR*)malloc(_tcsclen(buf)+1); if(temp == NULL){ MessageBox(hWnd, TEXT("Can't secure of memory"), TEXT("Error"), MB_OK); break; } for(int i=0; i<2; i++){ _fgetts(buf, 10, fp); _tcstok(buf, TEXT("\n")); } while(_fgetts(buf, 30, fp) != NULL){ _tcstok(buf, TEXT("\n")); _tcscpy(temp, buf); while(_stprintf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){ if((m>=0 && m<110)&&(n>=0 && n<200)){ if(mciSendString(_T("play C+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play C+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=110 && m<220)&&(n>=0 && n<200)){ if(mciSendString(_T("play D+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play D+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=220 && m<330)&&(n>=0 && n<200)){ if(mciSendString(_T("play E+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play E+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=330 && m<440)&&(n>=0 && n<200)){ if(mciSendString(_T("play F+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play F+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=440 && m<550)&&(n>=0 && n<200)){ if(mciSendString(_T("play G+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play G+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=550 && m<660)&&(n>=0 && n<200)){ if(mciSendString(_T("play A+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play A+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=660 && m<770)&&(n>=0 && n<200)){ if(mciSendString(_T("play B+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play B+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if(mciSendString(_T("play C.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play C.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=110 && m<220)&&(n>=200 && n<400)){ if(mciSendString(_T("play D.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play D.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; 以下省略 . . . }else{ break; } } } free(temp); fclose(fp); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wParam, lParam)); } return 0; }

  • 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; }

  • ソケット通信の受信処理について(マルチスレッド)

    今私はVisual Studio2010 C++で ソケット通信のプログラムをしているのですが、 クライアントから送ってくる文字をうまく受信できません。 接続は出来ています。 _beginthreadexでスレッドを作っています。 以下が受信の処理のスレッドになっています。 unsigned int __stdcall ThSend(void* pArg) {     CSocket_ServerDlg* pDlg = (CSocket_ServerDlg*)pArg; while(1){       char buf[256]; /* 受信するバッファ */ int buf_len; /* 受信したバイト数 */ buf_len = recv(pDlg->m_NewSoc,buf , RECVSIZE - 1, 0); if (buf_len != SOCKET_ERROR ){       buf[buf_len] = '\0'; /* 受信したバッファの後ろにNULLを付加する */       }       pDlg->m_xvEditResult += _T("Recv : ");       pDlg->m_xvEditResult += buf;       pDlg->m_xvEditResult += _T("\r\n"); } return 0; } "m_"はメンバ変数です。 以下がスレッド作成のソースになっています HANDLE hForth; unsigned int nForthID; hForth = (HANDLE)_beginthreadex(NULL, 0, ThSend , this, 0, &nForthID ); なぜ受信できないのか分からない状態です。 ではよろしくお願いします

  • 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); } よろしくお願いします.

  • 複数同時実行時の参照先について

    皆さんこんにちわ。 以下のプログラムを複数同時に実行した場合 あるプロセスにおいて、別プロセスと同じ bufの参照先に格納された文字列 を取得して実行してしまう現象が発生しております。 以下のソースについて何か問題のある部分 はございましたら教えて頂きたく思います。 よろしくお願い致します。 int m_create_process( char *command_line, bool sync ) { int command_len = strlen( command_line ); int ret_code = 0; char *buf = NULL; if ( (buf = (char *)malloc( (command_len + 10) * sizeof(char) )) == NULL ) { // malloc error! return -1; } strcpy( buf, command_line ); if ( !sync ) { strcat( buf, " &" ); } ret_code = system( buf ); ret_code = WEXITSTATUS(ret_code); free( buf ); return ret_code; }