いつも大変お世話になっております。
VC++初心者です。
現在、VC++6.0(MFC)で先人が作成したソースを改良しています。
デバグモードで動かすと、
以下のメッセージが表示されるのですが、
どのように対応すればよいか、教えていただけませんでしょうか。
「例外処理 (初回) は XXXX.exe (NTDLL.DLL) にあります: 0xC0000005: Access Violation」
(※XXXXはプロジェクト名です。)
(※デバグモードで動かすと同時に上記エラーが出力されます。)
上記のエラーが出ていても動かせるのですが、
デバグモード時に、メニューの「デバッグ」、「例外処理」で
「 Access Violation」の設定を
「ハンドルされてなければ停止」から「常に停止」に変更すると、
最初の画面も開けずに、混合モード画面の
7C95AB0A inc dword ptr [eax+10h]
という箇所で必ず止まって、落ちてしまいます。
ここから、どのように対処すればよいか、ご教授頂きたくお願いします。
No.7ベストアンサー
- 回答日時:
申し訳ありませんが、はっきり言って私にはお手上げ状態です。
混合モード画面で落ちた所から、コールスタック?スタックウィンドウ?(関数コールの履歴)を辿って、原因となったコードの箇所を見つければ、先に進むかもしれません。
この回答への補足
回答者の皆様、
今まで私の質問に対応して頂き、ありがとうございました。
一度、この質問は閉じさせて頂きます。
なお、本件のつづき(?)は
http://okwave.jp/qa5323629.html
で引き継ぎます。
ご回答、ありがとうございます。
これまでのご対応ありがとうございました。
別件で質問させて頂く機会がある時は
また、よろしくお願いします。
No.6
- 回答日時:
BROWSEINFO構造体のlpfnはNULLでも問題ないはずです。
http://msdn.microsoft.com/ja-jp/library/bb773205 …
たぶん関係ないですが、pszDisplayNameが挿している先をZeroMemory()でクリアしておく…とか。
>上記の「既存フォルダを参照するコード」のみを使用した
>プロジェクトをつくってみました。
ちなみに、VS2005でやってみましたが特にエラーなしでフォルダ選択ダイアログは表示されています。
>もとのソースがメモリリークしていたので、それを塞ぎました。
>そしてそのソースにあるコードを追加すると、起動するとすぐに
>「Access Violation」が発生します。
どういうリークで、どのように修正したのでしょう?
WinMain()やmain()に入る前に「Access Violation」が発生…ということでしょうか?
グローバル変数のコンストラクタでなにやらやっていたりしませんか?
この回答への補足
御回答、ありがとうございます。
WinMain()やmain()は見つかりませんでした。
(MFCを利用しているのから、隠されてる??)
現在は、メモリリークの箇所は問題ないと思うのですが、
こんな感じです。
(スレッドがダイアログを作っているので、
ダイアログを消してから、スレッドを消してます。)
void CXXXXXThread::PostNcDestroy()
{
//ダイアログ削除
if(m_pXXXXXDlg != NULL){
m_pXXXXXDlg->DestroyWindow();
delete m_pXXXXXDlg;
m_pXXXXXDlg = NULL;
}
//スレッド削除
//WaitForSingleObject(this->m_hThread, INFINITE);//スレッド終了までずっと待つ
TerminateThread(this->m_hThread, 0xffffffff);//スレッド強制終了
delete this;
}
先に公開したソースのみでプロジェクトでも
Violationがはっせいしているので、
SHBrowseForFolderの使い方に問題がありそうです。
調べてみると、初期化しなくてはいけない、と他サイトで
ありましたが、本件に関係あるのでしょうか。
No.5
- 回答日時:
私も、windows畑ではないので分かりません。
直接・本当の問題点では無いと思いますが気になった点を一つ。
BROWSEINFO構造体のコールバック関数のポインタを入れるメンバ変数(bInfo.lpfn)についてです。
SHBrowseForFolderをインターネットで検索すると、上記メンバにダイアログのコールバック関数のアドレスがセットされています。
しかし提示されたコードを見るとNULLがセットされていますが、何か意図があるのでしょうか?
WINDOWS側からコールバック関数を呼ぼうとしているが関数のアドレスがNULLのため、おかしくなっているのでは?
参考URL:http://sunafukin.jp/dannatti/software/vc/control …
この回答への補足
ご回答、ありがとうございます。
BROWSEINFO構造体のコールバック関数のポインタを入れるメンバ変数(bInfo.lpfn)は
NULLでも問題なさそうですが、自信ありません。
(今回の場合、WEBにあったソースをそのまま転用してしまいました。)
今度は、ちがうPCで今回のソースを動かしてみました。
すると、Access Violationが発生しません。
・Access Violationが発生する環境
・WinXp pro(SP3)、VC++6.0 (SP6)
・Access Violationが発生しない環境
・WinXp pro(SP2)、VC++6.0 (SP6)
・WinXp home(SP2)、VC++6.0 (--)
そして、現在まで確認できたことは、
1、以下を使用するとviolationが発生します。
・SHBrowseForFolder
・SHFileOperation
2、起動時にviolationが発生します。
(上記のSHBrowseForFolderなどを使用する前に、発生します。)
起動後は問題なく動いていそうです。
すみませんが、よろしくお願いします。
No.4
- 回答日時:
>コードを追加することによって、元ソースのエラーを誘発することは
>あるのでしょうか。
あります。
この回答への補足
御回答、ありがとうございます。
そうですか、、、
ちなみに、ボタンを用意して、そのボタンに
既存フォルダを参照するコードを埋め込むと
「 Access Violation」が発生します。
※某サイトを参考にしてつくっているので、問題ないように
思います。(動作も問題ありませんでした。)
****************
void CAAAAAA::OnButtonSelectFolder()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
UpdateData(TRUE);
BROWSEINFO bInfo;
LPITEMIDLIST pIDList;
TCHAR szDisplayName[MAX_PATH];
// BROWSEINFO構造体に値を設定
bInfo.hwndOwner = AfxGetMainWnd()->m_hWnd; // ダイアログの親ウインドウのハンドル
bInfo.pidlRoot = NULL; // ルートフォルダを示すITEMIDLISTのポインタ (NULLの場合デスクトップフォルダが使われます)
bInfo.pszDisplayName = szDisplayName; // 選択されたフォルダ名を受け取るバッファのポインタ
bInfo.lpszTitle = _T("フォルダの選択"); // ツリービューの上部に表示される文字列
bInfo.ulFlags = BIF_RETURNONLYFSDIRS; // 表示されるフォルダの種類を示すフラグ
bInfo.lpfn = NULL; // BrowseCallbackProc関数のポインタ
bInfo.lParam = (LPARAM)0; // コールバック関数に渡す値
// フォルダ選択ダイアログを表示
pIDList = ::SHBrowseForFolder(&bInfo);
if(pIDList == NULL){
// 戻り値がNULLの場合、フォルダが選択されずにダイアログが閉じられたことを意味します。
}else{
// ItemIDListをパス名に変換します
if(!::SHGetPathFromIDList(pIDList, szDisplayName)){
// エラー処理
}
// szDisplayNameに選択されたフォルダのパスが入っています
m_csFolderName = szDisplayName;
// 最後にpIDListのポイントしているメモリを開放します
::CoTaskMemFree( pIDList );
}
UpdateData(FALSE);//データ初期化(反映)
}
「お礼」と「補足」の欄がが逆になりますが、お許し下さい。
上記の「既存フォルダを参照するコード」のみを使用した
プロジェクトをつくってみました。
※ダイアログ上に、上記コードを埋め込むボタン、
エディットボックス(CString m_csFolderName;)を用意しました。
すると、「 Access Violation」が発生しました。
発生箇所は、
pIDList = ::SHBrowseForFolder(&bInfo);
から以降のようです。
これらから、何か分かりませんでしょうか。
No.3
- 回答日時:
「(NTDLL.DLL) にあります: 0xC0000005: Access Violation」でググって最初に表示されるページに書いてあったのですが、
プロジェクトの設定をシングルスレッドからマルチスレッドに変更すると良いらしいです。(未確認)
プロジェクト→設定→C/C++タブ
カテゴリをコード生成に変更
使用するランタイムライブラリ
この回答への補足
ご回答、ありがとうございます。
設定を確認すると、マルチスレッドになっていました。
(この設定が必要なことを知りませんでした。)
やはりソースにミスがあるのでしょうか、、、
No.2
- 回答日時:
お疲れ様です。
参照URLに記載したアドレスを見ても問題解決の糸口が見えなかったでしょうか?
おそらくはアクセスできないメモリにアクセスしています。
>> 一般的なバグの場合、
>> 元のソースでバグがなく、私がそのソースにコード加えた場合、
>> 私の加えたコードにバグが潜んでいると考えれますが、
>> 今回の「 Access Violation」の場合、
>> 元のソースで「 Access Violation」がなく、私がそのソース
>> にコード加えた場合、
>> 私の加えたコードにその要因が潜んでいるのでしょうか。
変更前のソースをデバッグモードで動かして「Access Violation」が出なければ、貴方のプログラム変更に誤りがあると考えるのがほぼ正しいと思います。
参考URL:http://msdn.microsoft.com/ja-jp/library/cc413691 …
この回答への補足
ご回答、ありがとうございます。
今回の経緯は、
もとのソースがメモリリークしていたので、それを塞ぎました。
そしてそのソースにあるコードを追加すると、起動するとすぐに
「Access Violation」が発生します。
そのコードが問題の原因と思って、別のコードを加えても
起動のするとすぐに「Access Violation」が発生します。
このように
コードを追加することによって、元ソースのエラーを誘発することは
あるのでしょうか。
No.1
- 回答日時:
お疲れ様です。
過去の質問を「Access Violation」で検索すると解決策が見えてくると思います。
参考URL:http://oshiete1.goo.ne.jp/qa3030097.html
この回答への補足
ご回答、ありがとうございます。
検索しても、なかなか自分の思う回答が見つかりませんでした。
すみませんが、以下の私の認識は正しいかどうか、
判断して頂けませんでしょうか。
一般的なバグの場合、
元のソースでバグがなく、私がそのソースにコード加えた場合、
私の加えたコードにバグが潜んでいると考えれますが、
今回の「 Access Violation」の場合、
元のソースで「 Access Violation」がなく、私がそのソースにコード加えた場合、
私の加えたコードにその要因が潜んでいるのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- Windows 10 VirtualBoxで起動できないゲームがあります 2 2022/12/17 06:13
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- Windows 10 Windows Updateが動作しません 7 2022/08/12 16:26
- CPU・メモリ・マザーボード BIOS画面で固まる(メーカーロゴの画面) 4 2022/08/03 17:41
- Windows 10 2023年05月03現在Win7sp1からWin10への無償アップグレードについて 6 2023/05/04 16:36
- 建設業・製造業 工場で安全装置を解除するアホがいて困る 1 2022/05/01 23:40
- 画像編集・動画編集・音楽編集 AfterEffectでのシャターの挙動がおかしい 1 2023/05/07 00:38
- UNIX・Linux Linux Ubuntu22.4の起動時エラーについて 2 2022/07/22 14:52
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラム時のヘッダコメント...
-
有料サイトに飛ばされる
-
VBAで#Regionに変わるものは無...
-
ソースの追加行数と変更行数
-
右クリック以外のソース表示方法
-
ポップアップを1日1回だけ表示...
-
IEでテキストの文字が一部だけ...
-
レストラン、英語のメニュー表記
-
ソースの表示を無効にする方法。
-
htmlソース文の 各行 改行位置...
-
VB詳しい方
-
実行オブジェクトからソースを...
-
c言語の改修されたソースから改...
-
#ifdef多用でソースが見づらい
-
JSPの実行結果をHTMLに変換
-
Dreamweaverのコードカラーが黒...
-
ソースを表示させない方法はあ...
-
ホームページの文字化け
-
ホームページビルダー HTMLの...
-
HTMLからフォルダを開きたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで#Regionに変わるものは無...
-
プログラム時のヘッダコメント...
-
【VC++6.0(MFC)】Access Violat...
-
ソースの追加行数と変更行数
-
Dreamweaverのコードカラーが黒...
-
レストラン、英語のメニュー表記
-
JSPの実行結果をHTMLに変換
-
#ifdef多用でソースが見づらい
-
ソースの表示を無効にする方法。
-
generatorとは?
-
VBAでhtmlソースから特定の文字...
-
c言語の改修されたソースから改...
-
「INT86(・・・・・・);」 っ...
-
コメントが閉じてないというエ...
-
jsファイルの中身を確認したい…
-
borderの下線が表示されない
-
画像と文字が重なって表示される。
-
VisualBasicがインストールされ...
-
htmlでソースを表示させたくな...
-
innerHTML で表示変更した時の...
おすすめ情報