DAX 錯誤另外一種解決辦法
阿新 • • 發佈:2019-01-28
一個是ParkingWindowProc()函式,修改如下:
function ParkingWindowProc(Wnd: HWND; Msg, wParam, lParam: Longint): Longint; stdcall;
var
ControlWnd: HWND;
begin
case Msg of
WM_COMPAREITEM, WM_DELETEITEM, WM_DRAWITEM, WM_MEASUREITEM, WM_COMMAND:
begin
case Msg of
WM_COMPAREITEM: ControlWnd := PCompareItemStruct(lParam).CtlID;
WM_DELETEITEM: ControlWnd := PDeleteItemStruct(lParam).CtlID;
WM_DRAWITEM: ControlWnd := PDrawItemStruct(lParam).CtlID;
WM_MEASUREITEM: ControlWnd := PMeasureItemStruct(lParam).CtlID;
WM_COMMAND: ControlWnd := HWND(lParam);
else
Result := 0;
Exit;
end;
Result := SendMessage(ControlWnd, OCM_BASE + Msg, wParam, lParam);
end;
else
////////////////////////////////////////////////////////////////////////////
//zhaoyan edit begin
{
if (Msg = WM_NCDESTROY) and (Wnd = xParkingWindow) then xParkingWindow := 0;
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
}
if (Msg = WM_NCDESTROY) and (Wnd = xParkingWindow) then
begin
xParkingWindow := 0;
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
end else begin
Result := SendMessage(ControlWnd, OCM_BASE + Msg, wParam, lParam);
end;
//zhaoyan edit end
/////////////////////////////////////////////////////////////////////////////
end;
end;
--------------------------------------------------------
另外一個是ParkingWindow()函式,修改如下:
function ParkingWindow: HWND;
var
TempClass: TWndClass;
ParkingName:String; //zhaoyan add
begin
Result := xParkingWindow;
if Result <> 0 then Exit;
//zhaoyan add start
//fixDaxerror:accessviolation(win2k,winxp)
ParkingName:='DAXParkingWindow_'+Format('%p',[@ParkingWindowProc]);
//zhaoyan add end
FillChar(TempClass, sizeof(TempClass), 0);
//zhaoyan edit start
//fixDaxerror:accessviolation(win2k,winxp)
if not GetClassInfo(HInstance,PChar(ParkingName),TempClass)then
//if not GetClassInfo(HInstance, 'DAXParkingWindow', TempClass) then
//zhaoyan edit end
begin
TempClass.hInstance := HInstance;
TempClass.lpfnWndProc := @ParkingWindowProc;
//zhaoyan edit start
TempClass.lpszClassName:=PChar(ParkingName);//fixDaxerror:accessviolation(win2k,winxp)
//TempClass.lpszClassName := 'DAXParkingWindow';
//zhaoyan edit end
if Windows.RegisterClass(TempClass) = 0 then
raise EOutOfResources.Create(SWindowClass);
end;
xParkingWindow := CreateWindowEx(WS_EX_TOOLWINDOW, TempClass.lpszClassName, nil,
WS_POPUP, GetSystemMetrics(SM_CXSCREEN) div 2,
GetSystemMetrics(SM_CYSCREEN) div 2, 0, 0, 0, 0, HInstance, nil);
SetWindowPos(xParkingWindow, 0, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOREDRAW
or SWP_NOZORDER or SWP_SHOWWINDOW);
Result := xParkingWindow;
end;
--------------------------------------------------------
結貼
--------------------------------------------------------
一個是ParkingWindowProc()函式,修改如下:
function ParkingWindowProc(Wnd: HWND; Msg, wParam, lParam: Longint): Longint; stdcall;
var
ControlWnd: HWND;
begin
case Msg of
WM_COMPAREITEM, WM_DELETEITEM, WM_DRAWITEM, WM_MEASUREITEM, WM_COMMAND:
begin
case Msg of
WM_COMPAREITEM: ControlWnd := PCompareItemStruct(lParam).CtlID;
WM_DELETEITEM: ControlWnd := PDeleteItemStruct(lParam).CtlID;
WM_DRAWITEM: ControlWnd := PDrawItemStruct(lParam).CtlID;
WM_MEASUREITEM: ControlWnd := PMeasureItemStruct(lParam).CtlID;
WM_COMMAND: ControlWnd := HWND(lParam);
else
Result := 0;
Exit;
end;
Result := SendMessage(ControlWnd, OCM_BASE + Msg, wParam, lParam);
end;
else
////////////////////////////////////////////////////////////////////////////
//zhaoyan edit begin
{
if (Msg = WM_NCDESTROY) and (Wnd = xParkingWindow) then xParkingWindow := 0;
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
}
if (Msg = WM_NCDESTROY) and (Wnd = xParkingWindow) then
begin
xParkingWindow := 0;
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
end else begin
Result := SendMessage(ControlWnd, OCM_BASE + Msg, wParam, lParam);
end;
//zhaoyan edit end
/////////////////////////////////////////////////////////////////////////////
end;
end;
按上面改後,對原有的在XP和2000系統的IE6環境下,控制元件無法釋放的問題解決了,但隨之而來的問題是原來在Tscrollbar中有一個TImage控制元件進行畫圖時,出現錯拉!造成更大的問題!