分类:
2008-08-28 11:57:12
近日,做一个在网页里面查看Word,Excel,PPT的ActiveX控件,在自己的机器上运行,很顺利,可是发布出去后,老是报错.很郁闷.看了一下报错的画面是:DAX Error.查大富翁,知道了问题的起因:
Delphi 的 ActiveX一个进程只有一个 ParkingWindow,这就有一个问题,如果在一个程序里,应用了两个ActiveX控件,问题就来了,实际上,在大部分情况下,IE是一个进程, 如果打开了多个ActiveX 控件页面,关闭其中一个,然后,再启动一个页面,就会出现 DAX Error。
是Delphi的VCL的一个BUG,而且从D5开始就有了,一直到了D7都没修改.估计这和宝兰公司的人员不稳定有关吧,没有人做长期的维护.同时也得到了解决方案,把VCL里的axctrls.pas 的ParkingWindow函数进行修改:
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;