by 高信期 » 2005年12月30日(金) 21:39
ABのバージョンが4になって以降私も同じ症状に悩まされています。
以前バグ報告板に投稿したのですが無しのつぶてだったので、
このような症状になるのは私の環境だけだと思いあきらめていました。
いろいろ調べてみましたが、
デバッグ実行時RegistWindowEx関数で登録、生成したウィンドウクラスにWM_DESTROYが投げられてきたときに
PostQuitMessage関数を呼び出す、またはそれ以外の処理の有無にかかわらず
ウィンドウ関数を抜けるとアクセス違反が起きるようです。
これらの症状はデバック実行で起き、
リリースコンパイルでは正常に終了します。
アクセス違反が必ず起きるコードを下に載せましたので、
バグの修正のほどをよろしくお願いします。
開発環境
Windows XP Home Edition Version2002 Service Pack 2
Internet Explorer 6.0 SP2
AB Version 4以降
コード: 全て選択
Dim hMainWnd As HWND
Dim hChildWnd As HWND
Function WndProc(hWnd As HWND, message As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
Select Case message
Case WM_CREATE
Dim pCS As *CREATESTRUCT
pCS = lParam As *CREATESTRUCT
hChildWnd = CreateWindowEx(0,
"CHILD",
"CHILD",
WS_OVERLAPPEDWINDOW or WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
320,
240,
hWnd,
0,
pCS->hInstance,
NULL)
Case WM_DESTROY
PostQuitMessage(0) 'ここでアクセス違反
MsgBox 0, "WM_DESTROY"
WndProc = 0
Case Else
WndProc = DefWindowProc(hWnd, message, wParam, lParam)
End Select
End Function
Function ChildProc(hWnd As HWND, message As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
'子ウィンドウでもアクセス違反
ChildProc = DefWindowProc(hWnd, message, wParam, lParam)
End Function
Dim wc As WNDCLASSEX
FillMemory(VarPtr(wc), Len(wc), 0)
With wc
.cbSize = SizeOf(WNDCLASSEX)
.hInstance = GetModuleHandle(0)
.style = CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW))
.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION))
.hIconSm = LoadIcon(NULL, MAKEINTRESOURCE(IDI_WINLOGO))
.lpszClassName = "PARENT"
.lpfnWndProc = AddressOf(WndProc)
.hbrBackground = (COLOR_3DFACE+1)
End With
RegisterClassEx(wc)
wc.lpszClassName = "CHILD"
wc.lpfnWndProc = AddressOf(ChildProc)
RegisterClassEx(wc)
RegisterClassEx(wc)
hMainWnd = CreateWindowEx(0,
"PARENT",
"PARENT",
WS_OVERLAPPEDWINDOW or WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
0,
0,
GetModuleHandle(0),
0)
Dim msgMain As MSG, iResult As Long
Do
iResult=GetMessage(msgMain, 0, 0, 0)
If iResult = 0 or iResult = -1 Then
MsgBox 0, "test" 'ここには来ない
Exit Do
End if
TranslateMessage(msgMain)
DispatchMessage(msgMain)
Loop
End
ABのバージョンが4になって以降私も同じ症状に悩まされています。
以前バグ報告板に投稿したのですが無しのつぶてだったので、
このような症状になるのは私の環境だけだと思いあきらめていました。
いろいろ調べてみましたが、
デバッグ実行時RegistWindowEx関数で登録、生成したウィンドウクラスにWM_DESTROYが投げられてきたときに
PostQuitMessage関数を呼び出す、またはそれ以外の処理の有無にかかわらず
ウィンドウ関数を抜けるとアクセス違反が起きるようです。
これらの症状はデバック実行で起き、
リリースコンパイルでは正常に終了します。
アクセス違反が必ず起きるコードを下に載せましたので、
バグの修正のほどをよろしくお願いします。
開発環境
Windows XP Home Edition Version2002 Service Pack 2
Internet Explorer 6.0 SP2
AB Version 4以降
[code]Dim hMainWnd As HWND
Dim hChildWnd As HWND
Function WndProc(hWnd As HWND, message As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
Select Case message
Case WM_CREATE
Dim pCS As *CREATESTRUCT
pCS = lParam As *CREATESTRUCT
hChildWnd = CreateWindowEx(0,
"CHILD",
"CHILD",
WS_OVERLAPPEDWINDOW or WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
320,
240,
hWnd,
0,
pCS->hInstance,
NULL)
Case WM_DESTROY
PostQuitMessage(0) 'ここでアクセス違反
MsgBox 0, "WM_DESTROY"
WndProc = 0
Case Else
WndProc = DefWindowProc(hWnd, message, wParam, lParam)
End Select
End Function
Function ChildProc(hWnd As HWND, message As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
'子ウィンドウでもアクセス違反
ChildProc = DefWindowProc(hWnd, message, wParam, lParam)
End Function
Dim wc As WNDCLASSEX
FillMemory(VarPtr(wc), Len(wc), 0)
With wc
.cbSize = SizeOf(WNDCLASSEX)
.hInstance = GetModuleHandle(0)
.style = CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW))
.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION))
.hIconSm = LoadIcon(NULL, MAKEINTRESOURCE(IDI_WINLOGO))
.lpszClassName = "PARENT"
.lpfnWndProc = AddressOf(WndProc)
.hbrBackground = (COLOR_3DFACE+1)
End With
RegisterClassEx(wc)
wc.lpszClassName = "CHILD"
wc.lpfnWndProc = AddressOf(ChildProc)
RegisterClassEx(wc)
RegisterClassEx(wc)
hMainWnd = CreateWindowEx(0,
"PARENT",
"PARENT",
WS_OVERLAPPEDWINDOW or WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
0,
0,
GetModuleHandle(0),
0)
Dim msgMain As MSG, iResult As Long
Do
iResult=GetMessage(msgMain, 0, 0, 0)
If iResult = 0 or iResult = -1 Then
MsgBox 0, "test" 'ここには来ない
Exit Do
End if
TranslateMessage(msgMain)
DispatchMessage(msgMain)
Loop
End[/code]