ファイル選択ダイアログで不正終了 – プログラミング – Home

ファイル選択ダイアログで不正終了
 
通知
すべてクリア

[解決済] ファイル選択ダイアログで不正終了


Qoo
 Qoo
(@Qoo)
ゲスト
結合: 20年前
投稿: 25
Topic starter  

こんにちは、いつもお世話になっております。
開発環境はVC++6.0 WindowsSDK win32API を作成しています。

現在、ファイル選択ダイアログを使用して
指定したファイルのパスを取得→ファイル読み込み
といった機能と
ファイル名を打ち込む→ファイル名とつけて保存
ということをしています。
ここで使用しているダイアログは猫のプログラムを流用した
一般的なコモンダイアログだと思います。
ですが、一度ファイルを読み込んでウインドウにデータを表示した後、
再度ファイルを読み込むためにファイル選択ダイアログを開き、
マウスのカーソルをファイルの上に当てるとプログラムが不正終了してしまいます。
ファイル選択ダイアログの機能の一つで、
マウスのカーソルをファイルにあわせるとそのファイルの情報が
小さい四角に表示されるのですが、それが関係しているような感じです。
ですがデバッグモードで試してみても
「ハンドルされていない例外は実行ファイル名.exe(SHELL32.DLL)にありま
す:0xC0000005: Access Violation」
と表示され、混合モードの途中で黄色い矢印が表示されます。
正直混合モードの見方が分からず、どこが間違っているのか全く分かりません。
どうにかこの不正終了を避ける方法はないでしょうか?


引用未解決
トピックタグ
...
 ...
(@...)
ゲスト
結合: 22年前
投稿: 113
 

コールスタックをさかのぼってご自分で書いたソースコードまで
戻れませんか?
Access Violationなので配列の境界を越えてアクセスしたとかじゃないかな?


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

どのようなタイミングで出ますか?
あと、ソースコードが問題だからソースコードを晒した方が早い。

もし、ファイルダイアログで[OK]ボタン押下時に出るランタイムエラーであれば、
ファイル名を入れるバッファを用意しないで、ポインタだけ渡しているとか?

ファイル名を入れるバッファは、
LPTSTR szFile = NULL;
ではなく、
TCHAR szFile[_MAX_PATH] = {0};
のように自前で用意したバッファを必要とします。


返信引用
Qoo
 Qoo
(@Qoo)
ゲスト
結合: 20年前
投稿: 25
Topic starter  

休日中はソースを見ることが出来なかったので返信遅れました^^;
タイミングも含めて状況を詳しく書きます。
1.ファイル選択ダイアログを呼び出す。
2.マウスのカーソルをファイルのアイコンにあわせる
3.不正終了する
条件
ファイル選択ダイアログがプログラム実行から数えて2度目以降の時に起こる
2度目で確実に起きるわけではない

というかんじです。
なのでタイミングとしましてはダイアログが表示された直後の状態の
マウスの操作で起きます。
ちなみに「猫でも分かるプログラミング」さんのソースを
HelloWorldのプロジェクトにそのまま移植しても起きちゃいました。
VCも不調みたいですし、そのせいとかもあるんでしょうか…?


返信引用
Qoo
 Qoo
(@Qoo)
ゲスト
結合: 20年前
投稿: 25
Topic starter  

//ここはグローバルの宣言
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;
}

そーすとしてはこんな感じです。
何か問題あるのでしょうか?


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

FileName と FileTitle を毎回 0 で初期化するとどうでしょうか?


返信引用
Qoo
 Qoo
(@Qoo)
ゲスト
結合: 20年前
投稿: 25
Topic starter  

アドバイスありがとうございます。
初期化してみましたがダメでした。
確かにこのソースだと毎回上書きになるのですがそれはそれでよろしくないですよね^^;
しかし原因は依然として不明です…汗
ちょっと帰宅したら家のVCでも試してみようと思います。
そっちで不具合がければVCのインストールがうまくいっていなかったということになりま
すよね。


返信引用
nice
 nice
(@nice)
ゲスト
結合: 19年前
投稿: 1
 

私も同じ症状に陥ったことがあります。
もしかしたらAdobe Reader 7.0がインストールされている環境ではないでしょうか。
Adobe Reader 7.0がインストール時に発生するバグということを耳にしました。
もし、インストールされている場合、
Adobe Reader 7.0をアンインストールして実行してみるといいかもしれません。


返信引用
Qoo
 Qoo
(@Qoo)
ゲスト
結合: 20年前
投稿: 25
Topic starter  

な、なんと!
niceさんの言うとおりでした!
Adobe Reader 7.0をアンインストールしたところ、不具合が起きなくなりました!
しかし何故こんなことが起きたのでしょうか…
その謎は僕の頭では解明できそうにありませんが助かりました!
ありがとうございました~!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました