ページ 1 / 1
原因がよく分からないアクセス違反
Posted: 2007年7月25日(水) 02:23
by mit
初めまして、最近ActiveBasicを始めた初心者です。
表題の件につきまして、知恵をお貸し頂けませんでしょうか。
Win32プログラミング講座にあるテキストエディタを作ってみたのですが、
ファイルオープンダイアログを2~4回開くとアクセス違反で終了してしまいます。
コンパイル時にエラー、警告は出ていません。
リリースコンパイルを行った場合でも、同様に2~4回開くと落ちました。
また、サンプルプロジェクトのテキストエディタでも同様の現象が起こりました。
過去ログで報告のありましたComputer Browser, Server, Workstationについては開始させ、
"GetOpenFileNameでエラーが出る方へ(XPで)"のトピックに従ってOPENFILENAME構造体も書き換えましたが
状況は変わりませんでした。
何とか解決する方法はありませんでしょうか。
よろしくお願いします。
WinXP Home SP2
ActiveBasic 4.24.00
Posted: 2007年7月25日(水) 04:02
by konisi
その、ファイルオープンの部分も含めて、もしよければ問題の関数丸ごと掲載できませんか?
BytePtr型で操作する部分でString型で適当に対処すると、コードによってはアクセス違反を起こすことがあります。
Posted: 2007年7月25日(水) 12:01
by mit
これが問題のコードです。
汚くてすいませんが、よろしくお願いします。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Sub MainWnd_IDM_OPEN_MenuClick()
dim hEdit as HANDLE
dim hOpenFile as HANDLE
dim ofn as OPENFILENAME
dim pszFileName as *Byte
dim dwFileSize as DWORD
dim dwAccessByte as DWORD
dim buff as *Byte
'ファイル名用メモリ確保
pszFileName = calloc(MAX_PATH)
if(pszFileName = NULL) then Exit Sub
'構造体の初期化
FillMemory(VarPtr(ofn), sizeof(OPENFILENAME), 0)
with ofn
.lStructSize = sizeof(OPENFILENAME)
.hwndOwner = hMainWnd
.lpstrFilter = Ex"テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0\0"
.nFilterIndex = 1
.lpstrFile = pszFileName
.nMaxFile = MAX_PATH
.lpstrTitle = "Open file"
.Flags = OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST
.lpstrDefExt="*"
end with
'ファイル選択
if (GetOpenFileName(ofn) = 0) then
free(pszFileName)
Exit Sub
end if
hOpenFile = CreateFile(ofn.lpstrFile, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, ByVal NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
if(hOpenFile = INVALID_HANDLE_VALUE) then
MessageBox(hMainWnd, "オープン失敗", "TextEditor", MB_OK)
free(pszFileName)
Exit Sub
end if
'ファイルサイズ取得
dwFileSize = GetFileSize(hOpenFile, NULL)
buff = calloc(dwFileSize + 1)
if(buff = NULL) then
CloseHandle(hOpenFile)
free(pszFileName)
Exit Sub
end if
'ファイル内容をバッファにコピー
ReadFile(hOpenFile, buff, dwFileSize, VarPtr(dwAccessByte), ByVal NULL)
CloseHandle(hOpenFile)
'エディットボックスに反映
hEdit = GetDlgItem(hMainWnd, EditBox1)
SetWindowText(hEdit, buff)
SetFocus(hEdit)
free(buff)
free(pszFileName)
End Sub
ただ、付属サンプルのテキストエディタでも発生するので、
もしかしたら別の所にも問題があるのかもしれませんが……。
Posted: 2007年7月25日(水) 18:42
by konisi
すみませんが、こちらでは現象を再現できませんでした。
だれか現象を再現できる人はいますか?
AB4.24
WinXP Home SP2
Posted: 2007年7月26日(木) 04:34
by ゲスト
メモリ確保の後こうしてみるとか
pszFileName[0]=0
構造体初期化の
FillMemoryを消してみるとか
CreateFile(ofn.lpstrFileをpszFileNameにしてみるとか
Posted: 2007年7月26日(木) 12:04
by mit
>konisi様
わざわざすいません
どうやら私の方の環境が原因のようですね……。
>ゲスト様
ありがとうございます
ただ、全て試してみたものの変化はありませんでした。
ファイルオープンダイアログを延々開くだけのプログラムを実行して詳しく調べてみたところ、
・ 何も選択せずキャンセルだけ選べば問題なし
・ 何かを選択した後に(開かずに)キャンセルを選んだ場合では何度目かでアクセス違反が発生
という事が分かりました。
それが分かったところで、どうすればいいのかはさっぱり分かりませんけど……。