Delphi 的 ActiveX一个进程只有一个 ParkingWindow,这就有一个问题,如果在一个程序里,应用了两个ActiveX控件,问题就来了,实际上,在大部分情况下,IE是一个进程,如果打开了多个ActiveX 控件页面,关闭其中一个,然后,再启动一个页面,就会出现 DAX Error。
DAX错误办法
好像有人贴过一个网址,说的解决办法,我把可能的解决办法(说可能因为我也不知道它是不是百分之一百有用)贴一下吧:
when using Internet Explorer in Wink2, WinXp, ActiveForm or ActiveX control raise
DAX error : access violation at address 000
reason :
delphi's ocx use same parking window procedure.
one ocx must use individual parking window proc.
fix error.
edit delphi VCL source routine in axctrls.pas
and compile axctrls.pas
copy axctrls.dcu to lib directory.
axctrls.pas
function ParkingWindow: HWND;
var
TempClass: TWndClass;
ParkingName : String;
begin
Result := xParkingWindow;
if Result <> 0 then
Exit;
// fix Dax error : accessviolation (win2k, win xp)
ParkingName := 'DAXParkingWindow_' + Format('%p', [@ParkingWindowProc]);
FillChar(TempClass, sizeof(TempClass), 0);
if not GetClassInfo(HInstance, PChar(ParkingName), TempClass) then
// fix Dax error : accessviolation (win2k, win xp)
begin
TempClass.hInstance := HInstance;
TempClass.lpfnWndProc := @ParkingWindowProc;
TempClass.lpszClassName := PChar(ParkingName);
// fix Dax error : accessviolation (win2k, win xp)
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;