一个是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控件进行画图时,出现错拉!造成更大的问题!
DAX 错误另外一种解决办法
最新推荐文章于 2009-01-07 11:14:00 发布