こんにちは、いつもお世話になっております。
開発環境はVC++6.0 WindowsSDK win32API を作成しています。
現在、ファイル選択ダイアログを使用して
指定したファイルのパスを取得→ファイル読み込み
といった機能と
ファイル名を打ち込む→ファイル名とつけて保存
ということをしています。
ここで使用しているダイアログは猫のプログラムを流用した
一般的なコモンダイアログだと思います。
ですが、一度ファイルを読み込んでウインドウにデータを表示した後、
再度ファイルを読み込むためにファイル選択ダイアログを開き、
マウスのカーソルをファイルの上に当てるとプログラムが不正終了してしまいます。
ファイル選択ダイアログの機能の一つで、
マウスのカーソルをファイルにあわせるとそのファイルの情報が
小さい四角に表示されるのですが、それが関係しているような感じです。
ですがデバッグモードで試してみても
「ハンドルされていない例外は実行ファイル名.exe(SHELL32.DLL)にありま
す:0xC0000005: Access Violation」
と表示され、混合モードの途中で黄色い矢印が表示されます。
正直混合モードの見方が分からず、どこが間違っているのか全く分かりません。
どうにかこの不正終了を避ける方法はないでしょうか?
コールスタックをさかのぼってご自分で書いたソースコードまで
戻れませんか?
Access Violationなので配列の境界を越えてアクセスしたとかじゃないかな?
どのようなタイミングで出ますか?
あと、ソースコードが問題だからソースコードを晒した方が早い。
もし、ファイルダイアログで[OK]ボタン押下時に出るランタイムエラーであれば、
ファイル名を入れるバッファを用意しないで、ポインタだけ渡しているとか?
ファイル名を入れるバッファは、
LPTSTR szFile = NULL;
ではなく、
TCHAR szFile[_MAX_PATH] = {0};
のように自前で用意したバッファを必要とします。
休日中はソースを見ることが出来なかったので返信遅れました^^;
タイミングも含めて状況を詳しく書きます。
1.ファイル選択ダイアログを呼び出す。
2.マウスのカーソルをファイルのアイコンにあわせる
3.不正終了する
条件
ファイル選択ダイアログがプログラム実行から数えて2度目以降の時に起こる
2度目で確実に起きるわけではない
というかんじです。
なのでタイミングとしましてはダイアログが表示された直後の状態の
マウスの操作で起きます。
ちなみに「猫でも分かるプログラミング」さんのソースを
HelloWorldのプロジェクトにそのまま移植しても起きちゃいました。
VCも不調みたいですし、そのせいとかもあるんでしょうか…?
//ここはグローバルの宣言
void OpenImgFiles(HWND);
int show = 0;
char FileName[MAX_PATH], FileTitle[64];
//ハローワールドのプロジェクトに追加した関数内容
void OpenImgFiles(HWND hWnd)
{
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter =
BMP files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0;
ofn.lpstrFile = FileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST;
ofn.lpstrDefExt = bmp;
ofn.nMaxFileTitle = 64;
ofn.lpstrFileTitle = FileTitle;
ofn.lpstrTitle = ";
if (GetOpenFileName(&ofn)) {
show = 1;
InvalidateRect(hWnd, NULL, TRUE);
}
return;
}
そーすとしてはこんな感じです。
何か問題あるのでしょうか?
FileName と FileTitle を毎回 0 で初期化するとどうでしょうか?
アドバイスありがとうございます。
初期化してみましたがダメでした。
確かにこのソースだと毎回上書きになるのですがそれはそれでよろしくないですよね^^;
しかし原因は依然として不明です…汗
ちょっと帰宅したら家のVCでも試してみようと思います。
そっちで不具合がければVCのインストールがうまくいっていなかったということになりま
すよね。
私も同じ症状に陥ったことがあります。
もしかしたらAdobe Reader 7.0がインストールされている環境ではないでしょうか。
Adobe Reader 7.0がインストール時に発生するバグということを耳にしました。
もし、インストールされている場合、
Adobe Reader 7.0をアンインストールして実行してみるといいかもしれません。
な、なんと!
niceさんの言うとおりでした!
Adobe Reader 7.0をアンインストールしたところ、不具合が起きなくなりました!
しかし何故こんなことが起きたのでしょうか…
その謎は僕の頭では解明できそうにありませんが助かりました!
ありがとうございました~!